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