Add new functions to import and export keys specified by gpgme_key_t.
[gpgme.git] / tests / gpg / pgp-export.c
1 /* pgp-export.c  - Helper to run an export command
2    Copyright (C) 2008, 2009 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, see <http://www.gnu.org/licenses/>.
18 */
19
20 /* We need to include config.h so that we know whether we are building
21    with large file system (LFS) support. */
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <string.h>
29
30 #include <gpgme.h>
31
32 #define PGM "pgp-export"
33
34 #include "t-support.h"
35
36
37 static int verbose;
38
39
40 static const char *
41 nonnull (const char *s)
42 {
43   return s? s :"[none]";
44 }
45
46
47 static int
48 show_usage (int ex)
49 {
50   fputs ("usage: " PGM " [options] USERIDS\n\n"
51          "Options:\n"
52          "  --verbose        run in verbose mode\n"
53          "  --extern         send keys to the keyserver (TAKE CARE!)\n"
54          , stderr);
55   exit (ex);
56 }
57
58 int 
59 main (int argc, char **argv)
60 {
61   int last_argc = -1;
62   gpgme_error_t err;
63   gpgme_ctx_t ctx;
64   gpgme_key_t key;
65   gpgme_keylist_result_t result;
66   gpgme_key_t keyarray[100];
67   int keyidx = 0;
68   gpgme_data_t out;
69   gpgme_export_mode_t mode = 0;
70
71   if (argc)
72     { argc--; argv++; }
73
74   while (argc && last_argc != argc )
75     {
76       last_argc = argc;
77       if (!strcmp (*argv, "--"))
78         {
79           argc--; argv++;
80           break;
81         }
82       else if (!strcmp (*argv, "--help"))
83         show_usage (0);
84       else if (!strcmp (*argv, "--verbose"))
85         {
86           verbose = 1;
87           argc--; argv++;
88         }
89       else if (!strcmp (*argv, "--extern"))
90         {
91           mode |= GPGME_KEYLIST_MODE_EXTERN;
92           argc--; argv++;
93         }
94       else if (!strncmp (*argv, "--", 2))
95         show_usage (1);
96       
97     }          
98  
99   if (!argc)
100     show_usage (1);
101
102   init_gpgme (GPGME_PROTOCOL_OpenPGP);
103
104   err = gpgme_new (&ctx);
105   fail_if_err (err);
106   gpgme_set_protocol (ctx, GPGME_PROTOCOL_OpenPGP);
107
108   /* Lookup the keys.  */
109   err = gpgme_op_keylist_ext_start (ctx, (const char**)argv, 0, 0);
110   fail_if_err (err);
111     
112   while (!(err = gpgme_op_keylist_next (ctx, &key)))
113     {
114       printf ("keyid: %s  (fpr: %s)\n",
115               key->subkeys?nonnull (key->subkeys->keyid):"?",
116               key->subkeys?nonnull (key->subkeys->fpr):"?");
117
118       if (keyidx < DIM (keyarray)-1)
119         keyarray[keyidx++] = key;
120       else
121         {
122           fprintf (stderr, PGM": too many keys"
123                    "- skipping this key\n");
124           gpgme_key_unref (key);
125         }
126     }
127   if (gpg_err_code (err) != GPG_ERR_EOF)
128     fail_if_err (err);
129   err = gpgme_op_keylist_end (ctx);
130   fail_if_err (err);
131   keyarray[keyidx] = NULL;
132
133   result = gpgme_op_keylist_result (ctx);
134   if (result->truncated)
135     {
136       fprintf (stderr, PGM ": key listing unexpectedly truncated\n");
137       exit (1);
138     }
139
140   /* Now for the actual export.  */
141   if ((mode & GPGME_KEYLIST_MODE_EXTERN))
142     printf ("sending keys to keyserver\n");
143
144   err = gpgme_data_new (&out);
145   fail_if_err (err);
146
147   gpgme_set_armor (ctx, 1);
148   err = gpgme_op_export_keys (ctx, keyarray, mode, 
149                               (mode & GPGME_KEYLIST_MODE_EXTERN)? NULL:out);
150   fail_if_err (err);
151
152   fflush (NULL);
153   if (!(mode & GPGME_KEYLIST_MODE_EXTERN))
154     {
155       fputs ("Begin Result:\n", stdout);
156       print_data (out);
157       fputs ("End Result.\n", stdout);
158     }
159
160   /* Cleanup.  */
161   gpgme_data_release (out);
162
163   for (keyidx=0; keyarray[keyidx]; keyidx++)
164     gpgme_key_unref (keyarray[keyidx]);
165
166   gpgme_release (ctx);
167   return 0;
168 }