Use gpgme interface for error handling to avoid linking with gpg-error.
[gpgme.git] / tests / gpg / t-support.h
1 /* t-support.h - Helper routines for regression tests.
2    Copyright (C) 2000 Werner Koch (dd9jn)
3    Copyright (C) 2001, 2002, 2003, 2004 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, write to the Free Software
19    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20    02111-1307, USA.  */
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, "%s:%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 *
52 nonnull (const char *s)
53 {
54   return s? s :"[none]";
55 }
56
57
58 void
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
76 passphrase_cb (void *opaque, const char *uid_hint, const char *passphrase_info,
77                int last_was_bad, int fd)
78 {
79 #ifdef HAVE_W32_SYSTEM
80   DWORD written;
81   WriteFile ((HANDLE) fd, "abc\n", 4, &written, 0);
82 #else
83   int res;
84   char *pass = "abc\n";
85   int passlen = strlen (pass);
86   int off = 0;
87
88   do
89     {
90       res = write (fd, &pass[off], passlen - off);
91       if (res > 0)
92         off += res;
93     }
94   while (res > 0 && off != passlen);
95
96   return off == passlen ? 0 : gpgme_error_from_errno (errno);
97 #endif
98
99   return 0;
100 }
101
102
103 char *
104 make_filename (const char *fname)
105 {
106   const char *srcdir = getenv ("srcdir");
107   char *buf;
108
109   if (!srcdir)
110     srcdir = ".";
111   buf = malloc (strlen(srcdir) + strlen(fname) + 2);
112   if (!buf) 
113     exit (8);
114   strcpy (buf, srcdir);
115   strcat (buf, "/");
116   strcat (buf, fname);
117   return buf;
118 }
119
120
121 void
122 init_gpgme (gpgme_protocol_t proto)
123 {
124   gpgme_error_t err;
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   err = gpgme_engine_check_version (proto);
134   fail_if_err (err);
135 }
136
137
138 void
139 print_import_result (gpgme_import_result_t r)
140 {
141   gpgme_import_status_t st;
142
143   for (st=r->imports; st; st = st->next)
144     {
145       printf ("  fpr: %s err: %d (%s) status:", nonnull (st->fpr),
146               st->result, gpgme_strerror (st->result));
147       if (st->status & GPGME_IMPORT_NEW)
148         fputs (" new", stdout);
149       if (st->status & GPGME_IMPORT_UID)
150         fputs (" uid", stdout);
151       if (st->status & GPGME_IMPORT_SIG)
152         fputs (" sig", stdout);
153       if (st->status & GPGME_IMPORT_SUBKEY)
154         fputs (" subkey", stdout);
155       if (st->status & GPGME_IMPORT_SECRET)
156         fputs (" secret", stdout);
157       putchar ('\n');
158     }
159   printf ("key import summary:\n"
160           "        considered: %d\n"
161           "        no user id: %d\n"
162           "          imported: %d\n"
163           "      imported_rsa: %d\n"
164           "         unchanged: %d\n"
165           "      new user ids: %d\n"
166           "       new subkeys: %d\n"
167           "    new signatures: %d\n"
168           "   new revocations: %d\n"
169           "       secret read: %d\n"
170           "   secret imported: %d\n"
171           "  secret unchanged: %d\n"
172           "  skipped new keys: %d\n"
173           "      not imported: %d\n",
174           r->considered,
175           r->no_user_id,
176           r->imported,
177           r->imported_rsa,
178           r->unchanged,
179           r->new_user_ids,
180           r->new_sub_keys,
181           r->new_signatures,
182           r->new_revocations,
183           r->secret_read,
184           r->secret_imported,
185           r->secret_unchanged,
186           r->skipped_new_keys,
187           r->not_imported);
188 }
189