1 /* run-support.h - Helper routines for run-* test programs.
2  * Copyright (C) 2000 Werner Koch (dd9jn)
3  * Copyright (C) 2001, 2002, 2003, 2004, 2009 g10 Code GmbH
4  *
5  * This file is part of GPGME.
6  *
7  * GPGME is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU Lesser General Public License as
9  * published by the Free Software Foundation; either version 2.1 of
10  * the License, or (at your option) any later version.
11  *
12  * GPGME is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this program; if not, see <https://gnu.org/licenses/>.
19  * SPDX-License-Identifier: LGPL-2.1-or-later
20  */
21 
22 #include <unistd.h>
23 #include <errno.h>
24 #include <stdlib.h>
25 #include <locale.h>
26 
27 #ifdef HAVE_W32_SYSTEM
28 #include <windows.h>
29 #endif
30 
31 #include <gpgme.h>
32 
33 #ifndef DIM
34 #define DIM(v)		     (sizeof(v)/sizeof((v)[0]))
35 #endif
36 
37 #define fail_if_err(err)					\
38   do								\
39     {								\
40       if (err)							\
41         {							\
42           fprintf (stderr, PGM": file %s line %d: <%s> %s\n",	\
43                    __FILE__, __LINE__, gpgme_strsource (err),	\
44 		   gpgme_strerror (err));			\
45           exit (1);						\
46         }							\
47     }								\
48   while (0)
49 
50 
51 static const char *
nonnull(const char * s)52 nonnull (const char *s)
53 {
54   return s? s :"[none]";
55 }
56 
57 
58 void
print_data(gpgme_data_t dh)59 print_data (gpgme_data_t dh)
60 {
61 #define BUF_SIZE 512
62   char buf[BUF_SIZE + 1];
63   int ret;
64 
65   ret = gpgme_data_seek (dh, 0, SEEK_SET);
66   if (ret)
67     fail_if_err (gpgme_err_code_from_errno (errno));
68   while ((ret = gpgme_data_read (dh, buf, BUF_SIZE)) > 0)
69     fwrite (buf, ret, 1, stdout);
70   if (ret < 0)
71     fail_if_err (gpgme_err_code_from_errno (errno));
72 }
73 
74 
75 gpgme_error_t
passphrase_cb(void * opaque,const char * uid_hint,const char * passphrase_info,int last_was_bad,int fd)76 passphrase_cb (void *opaque, const char *uid_hint, const char *passphrase_info,
77 	       int last_was_bad, int fd)
78 {
79   int res;
80   char pass[] = "abc\n";
81   int passlen = strlen (pass);
82   int off = 0;
83 
84   (void)opaque;
85   (void)uid_hint;
86   (void)passphrase_info;
87   (void)last_was_bad;
88 
89   do
90     {
91       res = gpgme_io_write (fd, &pass[off], passlen - off);
92       if (res > 0)
93 	off += res;
94     }
95   while (res > 0 && off != passlen);
96 
97   return off == passlen ? 0 : gpgme_error_from_errno (errno);
98 }
99 
100 
101 char *
make_filename(const char * fname)102 make_filename (const char *fname)
103 {
104   const char *srcdir = getenv ("srcdir");
105   char *buf;
106 
107   if (!srcdir)
108     srcdir = ".";
109   buf = malloc (strlen(srcdir) + strlen(fname) + 2);
110   if (!buf)
111     {
112       fprintf (stderr, "%s:%d: could not allocate string: %s\n",
113 	       __FILE__, __LINE__, strerror (errno));
114       exit (8);
115     }
116   strcpy (buf, srcdir);
117   strcat (buf, "/");
118   strcat (buf, fname);
119   return buf;
120 }
121 
122 
123 void
init_gpgme_basic(void)124 init_gpgme_basic (void)
125 {
126   gpgme_check_version (NULL);
127   setlocale (LC_ALL, "");
128   gpgme_set_locale (NULL, LC_CTYPE, setlocale (LC_CTYPE, NULL));
129 #ifndef HAVE_W32_SYSTEM
130   gpgme_set_locale (NULL, LC_MESSAGES, setlocale (LC_MESSAGES, NULL));
131 #endif
132 }
133 
134 
135 void
init_gpgme(gpgme_protocol_t proto)136 init_gpgme (gpgme_protocol_t proto)
137 {
138   gpg_error_t err;
139 
140   init_gpgme_basic ();
141   err = gpgme_engine_check_version (proto);
142   fail_if_err (err);
143 }
144 
145 
146 void
print_import_result(gpgme_import_result_t r)147 print_import_result (gpgme_import_result_t r)
148 {
149   gpgme_import_status_t st;
150 
151   for (st=r->imports; st; st = st->next)
152     {
153       printf ("  fpr: %s err: %d (%s) status:", nonnull (st->fpr),
154               st->result, gpgme_strerror (st->result));
155       if (st->status & GPGME_IMPORT_NEW)
156         fputs (" new", stdout);
157       if (st->status & GPGME_IMPORT_UID)
158         fputs (" uid", stdout);
159       if (st->status & GPGME_IMPORT_SIG)
160         fputs (" sig", stdout);
161       if (st->status & GPGME_IMPORT_SUBKEY)
162         fputs (" subkey", stdout);
163       if (st->status & GPGME_IMPORT_SECRET)
164         fputs (" secret", stdout);
165       putchar ('\n');
166     }
167   printf ("key import summary:\n"
168           "        considered: %d\n"
169           "        no user id: %d\n"
170           "          imported: %d\n"
171           "      imported_rsa: %d\n"
172           "         unchanged: %d\n"
173           "      new user ids: %d\n"
174           "       new subkeys: %d\n"
175           "    new signatures: %d\n"
176           "   new revocations: %d\n"
177           "       secret read: %d\n"
178           "   secret imported: %d\n"
179           "  secret unchanged: %d\n"
180           "  skipped new keys: %d\n"
181           "      not imported: %d\n"
182           "   skipped v3 keys: %d\n",
183           r->considered,
184           r->no_user_id,
185           r->imported,
186           r->imported_rsa,
187           r->unchanged,
188           r->new_user_ids,
189           r->new_sub_keys,
190           r->new_signatures,
191           r->new_revocations,
192           r->secret_read,
193           r->secret_imported,
194           r->secret_unchanged,
195           r->skipped_new_keys,
196           r->not_imported,
197           r->skipped_v3_keys);
198 }
199 
200