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