Updated FSF's address.
[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
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
60     { 301, NULL, 0, N_("@\nOptions:\n ") },
61     
62     { oOutput, "output",    2, N_("use as output file") },
63     { oVerbose, "verbose",  0, N_("verbose") },
64     { oQuiet, "quiet",      0, N_("quiet") },
65     { oDryRun, "dry-run",   0, N_("do not make any changes") },
66     { oRuntime, "runtime",  0, N_("activate changes at runtime, if possible") },
67
68     /* hidden options */
69     { oNoVerbose, "no-verbose",  0, "@"},
70     {0}
71   };
72
73
74 /* Print usage information and and provide strings for help. */
75 static const char *
76 my_strusage( int level )
77 {
78   const char *p;
79
80   switch (level)
81     {
82     case 11: p = "gpgconf (GnuPG)";
83       break;
84     case 13: p = VERSION; break;
85     case 17: p = PRINTABLE_OS_NAME; break;
86     case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n");
87       break;
88     case 1:
89     case 40: p = _("Usage: gpgconf [options] (-h for help)");
90       break;
91     case 41:
92       p = _("Syntax: gpgconf [options]\n"
93             "Manage configuration options for tools of the GnuPG system\n");
94       break;
95
96     default: p = NULL; break;
97     }
98   return p;
99 }
100
101
102 /* Initialize the gettext system. */
103 static void
104 i18n_init(void)
105 {
106 #ifdef USE_SIMPLE_GETTEXT
107   set_gettext_file (PACKAGE_GT);
108 #else
109 # ifdef ENABLE_NLS
110   setlocale (LC_ALL, "" );
111   bindtextdomain (PACKAGE_GT, LOCALEDIR);
112   textdomain (PACKAGE_GT);
113 # endif
114 #endif
115 }
116
117
118 /* gpgconf main. */
119 int
120 main (int argc, char **argv)
121 {
122   ARGPARSE_ARGS pargs;
123   const char *fname;
124   int no_more_options = 0;
125   enum cmd_and_opt_values cmd = 0;
126
127   set_strusage (my_strusage);
128   log_set_prefix ("gpgconf", 1);
129
130   i18n_init();
131
132   /* Parse the command line. */
133   pargs.argc  = &argc;
134   pargs.argv  = &argv;
135   pargs.flags =  1;  /* Do not remove the args.  */
136   while (!no_more_options && optfile_parse (NULL, NULL, NULL, &pargs, opts))
137     {
138       switch (pargs.r_opt)
139         {
140         case oOutput:    opt.outfile = pargs.r.ret_str; break;
141         case oQuiet:     opt.quiet = 1; break;
142         case oDryRun:    opt.dry_run = 1; break;
143         case oRuntime:
144           opt.runtime = 1;
145           break;
146         case oVerbose:   opt.verbose++; break;
147         case oNoVerbose: opt.verbose = 0; break;
148
149         case aListComponents:
150         case aListOptions:
151         case aChangeOptions:
152           cmd = pargs.r_opt;
153           break;
154
155         default: pargs.err = 2; break;
156         }
157     }
158
159   if (log_get_errorcount (0))
160     exit (2);
161   
162   fname = argc ? *argv : NULL;
163   
164   switch (cmd)
165     {
166     case aListComponents:
167     default:
168       /* List all components. */
169       gc_component_list_components (stdout);
170       break;
171
172     case aListOptions:
173     case aChangeOptions:
174       if (!fname)
175         {
176           fputs (_("usage: gpgconf [options] "), stderr);
177           putc ('\n',stderr);
178           fputs (_("Need one component argument"), stderr);
179           putc ('\n',stderr);
180           exit (2);
181         }
182       else
183         {
184           int idx = gc_component_find (fname);
185           if (idx < 0)
186             {
187               fputs (_("Component not found"), stderr);
188               putc ('\n', stderr);
189               exit (1);
190             }
191           gc_component_retrieve_options (idx);
192           if (cmd == aListOptions)
193             gc_component_list_options (idx, stdout);
194           else
195             gc_component_change_options (idx, stdin);
196         }
197     }
198   
199   return 0; 
200 }
201
202
203