8e487b7ad030ff1f507d3f7d2c5d5604f2459c9e
[gpgme.git] / tests / gpg / t-gpgconf.c
1 /* t-gpgconf.c - Regression test.
2    Copyright (C) 2001, 2004, 2007 g10 Code GmbH
3
4    This file is part of GPGME.
5
6    GPGME is free software; you can redistribute it and/or modify it
7    under the terms of the GNU Lesser General Public License as
8    published by the Free Software Foundation; either version 2.1 of
9    the License, or (at your option) any later version.
10    
11    GPGME is distributed in the hope that it will be useful, but
12    WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15    
16    You should have received a copy of the GNU Lesser General Public
17    License along with this program; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19    02111-1307, USA.  */
20
21 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24
25 #include <unistd.h>
26 #include <errno.h>
27 #include <stdlib.h>
28 #include <locale.h>
29 #include <string.h>
30
31 #ifdef HAVE_W32_SYSTEM
32 #include <windows.h>
33 #endif
34
35 #include <gpgme.h>
36
37
38 #define fail_if_err(err)                                        \
39   do                                                            \
40     {                                                           \
41       if (err)                                                  \
42         {                                                       \
43           fprintf (stderr, "%s:%d: %s: %s\n",                   \
44                    __FILE__, __LINE__, gpgme_strsource (err),   \
45                    gpgme_strerror (err));                       \
46           exit (1);                                             \
47         }                                                       \
48     }                                                           \
49   while (0)
50
51
52 void
53 init_gpgme (gpgme_protocol_t proto)
54 {
55   gpgme_error_t err;
56
57   gpgme_check_version (NULL);
58   setlocale (LC_ALL, "");
59   gpgme_set_locale (NULL, LC_CTYPE, setlocale (LC_CTYPE, NULL));
60 #ifndef HAVE_W32_SYSTEM
61   gpgme_set_locale (NULL, LC_MESSAGES, setlocale (LC_MESSAGES, NULL));
62 #endif
63
64   err = gpgme_engine_check_version (proto);
65   fail_if_err (err);
66 }
67
68 \f
69 static char *
70 spaces (char *str, int extra)
71 {
72   static char buf[80];
73   int len = str ? strlen (str) : 0;
74   int n;
75
76 #define TABSTOP 30
77   n = TABSTOP - len - extra;
78
79   memset (buf, ' ', sizeof (buf));
80   if (n < 1 || n > (sizeof (buf) - 1))
81     {
82       buf[0] = '\n';
83       n = TABSTOP + 1;
84     }
85
86   buf[n] = '\0';
87   return buf;
88 }
89
90
91 void
92 dump_arg (int type, gpgme_conf_arg_t arg)
93 {
94   if (!arg)
95     {
96       printf ("(none)");
97       return;
98     }
99
100   while (arg)
101     {
102       switch (type)
103         {
104         case GPGME_CONF_STRING:
105         case GPGME_CONF_PATHNAME:
106         case GPGME_CONF_LDAP_SERVER:
107         case GPGME_CONF_KEY_FPR:
108         case GPGME_CONF_PUB_KEY:
109         case GPGME_CONF_SEC_KEY:
110         case GPGME_CONF_ALIAS_LIST:
111           printf ("`%s'", arg->value.string);
112           break;
113
114         case GPGME_CONF_UINT32:
115           printf ("%u", arg->value.uint32);
116           break;
117
118         case GPGME_CONF_INT32:
119           printf ("%i", arg->value.int32);
120           break;
121
122         case GPGME_CONF_NONE:
123           printf ("%i (times)", arg->value.count);
124           break;
125
126         default:
127           printf ("(unknown type)");
128         }
129
130       arg = arg->next;
131       if (arg)
132         printf (" ");
133     }
134 }
135
136
137 void
138 dump_opt (gpgme_conf_opt_t opt)
139 {
140   char level;
141   char runtime = (opt->flags & GPGME_CONF_RUNTIME) ? 'r' : ' ';
142
143   switch (opt->level)
144     {
145     case GPGME_CONF_BASIC:
146       level = 'b';
147       break;
148     case GPGME_CONF_ADVANCED:
149       level = 'a';
150       break;
151     case GPGME_CONF_EXPERT:
152       level = 'e';
153       break;
154     case GPGME_CONF_INVISIBLE:
155       level = 'i';
156       break;
157     case GPGME_CONF_INTERNAL:
158       level = '#';
159       break;
160     default:
161       level = '?';
162     }
163
164   if (opt->flags & GPGME_CONF_GROUP)
165     {
166       printf ("\n");
167       printf ("%c%c [%s]%s%s\n", level, runtime, opt->name, spaces (opt->name, 5),
168               opt->description
169               ? opt->description : "");
170     }
171   else
172     {
173       if (opt->argname)
174         {
175           char *more = (opt->flags & GPGME_CONF_LIST) ? "..." : "";
176       
177           if (opt->flags & GPGME_CONF_OPTIONAL)
178             {
179               printf ("%c%c --%s [%s%s] %s", level, runtime, opt->name, opt->argname, more,
180                       spaces (opt->name, 9 + strlen (opt->argname) + strlen (more)));
181             }
182           else
183             {
184               printf ("%c%c --%s %s%s %s", level, runtime, opt->name, opt->argname, more,
185                       spaces (opt->name, 7 + strlen (opt->argname) + strlen (more)));
186             }
187         }
188       else
189         printf ("%c%c --%s%s", level, runtime, opt->name, spaces (opt->name, 5));
190       
191       if (opt->description)
192         printf ("%s", opt->description);
193       printf ("\n");
194
195       if (opt->flags & GPGME_CONF_DEFAULT)
196         {
197           printf ("%s%s = ", spaces (NULL, 0), opt->argname ? opt->argname : "(default)");
198           dump_arg (opt->type, opt->default_value);
199           printf ("\n");
200         }
201       else if (opt->flags & GPGME_CONF_DEFAULT_DESC)
202         printf ("%s%s = %s\n", spaces (NULL, 0), opt->argname ? opt->argname : "(default)",
203                 opt->default_description);
204
205       if (opt->no_arg_value)
206         {
207           printf ("%sNo Arg Def = ", spaces (NULL, 0));
208           dump_arg (opt->type, opt->no_arg_value);
209           printf ("\n");
210         }
211       if (opt->value)
212         {
213           printf ("%sCurrent = ", spaces (NULL, 0));
214           dump_arg (opt->type, opt->value);
215           printf ("\n");
216         }
217     }
218
219 #if 0
220   arg = comp->options;
221   while (opt)
222     {
223       dump_opt (opt);
224       opt = opt->next;
225     }
226 #endif
227 }
228
229
230 void
231 dump_comp (gpgme_conf_comp_t comp)
232 {
233   gpgme_conf_opt_t opt;
234
235   printf ("COMPONENT\n");
236   printf ("=========\n");
237   printf ("  Name: %s\n", comp->name);
238   if (comp->description)
239     printf ("  Desc: %s\n", comp->description);
240   if (comp->program_name)
241     printf ("  Path: %s\n", comp->program_name);
242   printf ("\n");
243
244   opt = comp->options;
245   while (opt)
246     {
247       dump_opt (opt);
248       opt = opt->next;
249     }
250 }
251
252
253 int 
254 main (int argc, char **argv)
255 {
256   gpgme_ctx_t ctx;
257   gpgme_error_t err;
258   gpgme_conf_comp_t conf;
259   gpgme_conf_comp_t comp;
260   int first;
261
262 #ifndef ENABLE_GPGCONF
263   return 0;
264 #endif
265
266   init_gpgme (GPGME_PROTOCOL_GPGCONF);
267
268   err = gpgme_new (&ctx);
269   fail_if_err (err);
270
271   err = gpgme_op_conf_load (ctx, &conf);
272   fail_if_err (err);
273
274   comp = conf;
275   first = 1;
276   while (comp)
277     {
278       if (!first)
279         printf ("\n");
280       else
281         first = 0;
282       dump_comp (comp);
283       comp = comp->next;
284     }
285
286 #if 1
287   /* Now change something.  */
288   {
289     unsigned int count = 1;
290     gpgme_conf_arg_t arg;
291     gpgme_conf_opt_t opt;
292
293     err = gpgme_conf_arg_new (&arg, GPGME_CONF_NONE, &count);
294     fail_if_err (err);
295
296     comp = conf;
297     while (comp && strcmp (comp->name, "dirmngr"))
298       comp = comp->next;
299
300     if (comp)
301       {
302         opt = comp->options;
303         while (opt && strcmp (opt->name, "verbose"))
304           opt = opt->next;
305         
306         /* Allow for the verbose option not to be there.  */
307         if (opt)
308           {
309             err = gpgme_conf_opt_change (opt, 0, arg);
310             fail_if_err (err);
311             
312             err = gpgme_op_conf_save (ctx, comp);
313             fail_if_err (err);
314           }
315       }
316   }
317 #endif
318
319   gpgme_conf_release (conf);
320
321   return 0;
322 }