d77cd7028ead00aebc0a66aad6a7ddf090fd23bd
[gpgme.git] / tests / gpg / t-keylist.c
1 /* t-keylist.c  - regression test
2  *      Copyright (C) 2000 Werner Koch (dd9jn)
3  *      Copyright (C) 2001 g10 Code GmbH
4  *
5  * This file is part of GPGME.
6  *
7  * GPGME is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * GPGME is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20  */
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <assert.h>
26
27 #include <gpgme.h>
28
29 #define fail_if_err(a) do { if(a) {                                       \
30                                fprintf (stderr, "%s:%d: GpgmeError %s\n", \
31                                 __FILE__, __LINE__, gpgme_strerror(a));   \
32                                 exit (1); }                               \
33                              } while(0)
34
35 static void
36 doit (GpgmeCtx ctx, const char *pattern)
37 {
38   GpgmeError err;
39   GpgmeKey key;
40
41   err = gpgme_op_keylist_start (ctx, pattern, 0);
42   fail_if_err (err);
43     
44   while (!(err = gpgme_op_keylist_next (ctx, &key)))
45     {
46       char *p;
47       const char *s;
48       int i;
49
50       printf ("<!-- Begin key object (%p) -->\n", key);
51       p = gpgme_key_get_as_xml (key);
52       if (p)
53         {
54           fputs (p, stdout);
55           free (p);
56         }
57       else
58         fputs("<!-- Ooops: gpgme_key_get_as_xml failed -->\n", stdout);
59
60       for (i = 0; ; i++)
61         {
62           s = gpgme_key_get_string_attr (key, GPGME_ATTR_KEYID, NULL, i);
63           if (!s)
64             break;
65           printf ("<!-- keyid.%d=%s -->\n", i, s);
66           s = gpgme_key_get_string_attr (key, GPGME_ATTR_ALGO, NULL, i);
67           printf ("<!-- algo.%d=%s -->\n", i, s);
68           s = gpgme_key_get_string_attr (key, GPGME_ATTR_KEY_CAPS, NULL, i);
69           printf ("<!-- caps.%d=%s -->\n", i, s);
70         }
71       for (i = 0; ; i++)
72         {
73           s = gpgme_key_get_string_attr (key, GPGME_ATTR_NAME, NULL, i);
74           if (!s)
75             break;
76           printf ("<!-- name.%d=%s -->\n", i, s);
77           s = gpgme_key_get_string_attr (key, GPGME_ATTR_EMAIL, NULL, i);
78           printf ("<!-- email.%d=%s -->\n", i, s);
79           s = gpgme_key_get_string_attr (key, GPGME_ATTR_COMMENT, NULL, i);
80           printf ("<!-- comment.%d=%s -->\n", i, s);
81         }
82       
83       fputs ("<!-- usable for:", stdout);
84       if ( gpgme_key_get_ulong_attr (key, GPGME_ATTR_CAN_ENCRYPT, NULL, 0))
85         fputs (" encryption", stdout);
86       if ( gpgme_key_get_ulong_attr (key, GPGME_ATTR_CAN_SIGN, NULL, 0))
87         fputs (" signing", stdout);
88       if ( gpgme_key_get_ulong_attr (key, GPGME_ATTR_CAN_CERTIFY, NULL, 0))
89         fputs (" certification", stdout);
90       fputs (" -->\n", stdout );
91       
92       printf ("<!-- End key object (%p) -->\n", key);
93       gpgme_key_release (key);
94     }
95   if (err != GPGME_EOF)
96     fail_if_err (err);
97 }
98
99
100 /* 
101  * Check that there are no problems when we are using two context for
102  * listing keys. 
103  */
104 static void
105 check_two_contexts (void)
106 {
107   GpgmeError err;
108   GpgmeCtx ctx1, ctx2;
109   GpgmeKey key;
110         
111   err = gpgme_new(&ctx1); fail_if_err (err);
112   err = gpgme_op_keylist_start(ctx1, "", 1);
113   fail_if_err (err);
114   err = gpgme_new(&ctx2); fail_if_err (err);
115   err = gpgme_op_keylist_start(ctx2, "", 1);
116   fail_if_err (err);
117   
118   while ((err = gpgme_op_keylist_next (ctx2, &key)) != GPGME_EOF)
119     gpgme_key_release (key);
120
121   if (err != GPGME_EOF)
122     fail_if_err (err);
123   while ((err=gpgme_op_keylist_next(ctx1, &key)) != GPGME_EOF)
124     gpgme_key_release (key);
125
126   if (err != GPGME_EOF)
127     fail_if_err (err);
128 }
129
130
131 int 
132 main (int argc, char **argv)
133 {
134   GpgmeCtx ctx;
135   GpgmeError err;
136   int loop = 0;
137   const char *pattern;
138     
139   if (argc)
140     {
141       argc--;
142       argv++;
143     }
144     
145   if (argc && !strcmp( *argv, "--loop"))
146     {
147       loop = 1;
148       argc--; argv++;
149     }
150   pattern = argc? *argv : NULL;
151
152   err = gpgme_check_engine();
153   fail_if_err (err);
154
155   err = gpgme_new (&ctx);
156   fail_if_err (err);
157   /* No validity calculation.  */
158   gpgme_set_keylist_mode (ctx, 1);
159   do
160     {
161       fprintf (stderr, "** pattern=`%s'\n", pattern ? pattern : "(null)");
162       doit (ctx, pattern);
163     }
164   while (loop);
165   gpgme_release (ctx);
166
167   check_two_contexts ();
168
169   return 0;
170 }