tests: Fix additional memleaks in thread tests
[gpgme.git] / tests / run-identify.c
1 /* run-identify  - Helper to run the identify command
2  * Copyright (C) 2016 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 "run-identify"
33
34 #include "run-support.h"
35
36
37 static int verbose;
38
39
40 static const char *
41 data_type_to_string (gpgme_data_type_t dt)
42 {
43   const char *s = "[?]";
44
45   switch (dt)
46     {
47     case GPGME_DATA_TYPE_INVALID      : s = "invalid"; break;
48     case GPGME_DATA_TYPE_UNKNOWN      : s = "unknown"; break;
49     case GPGME_DATA_TYPE_PGP_SIGNED   : s = "PGP-signed"; break;
50     case GPGME_DATA_TYPE_PGP_SIGNATURE: s = "PGP-signature"; break;
51     case GPGME_DATA_TYPE_PGP_ENCRYPTED: s = "PGP-encrypted"; break;
52     case GPGME_DATA_TYPE_PGP_OTHER    : s = "PGP"; break;
53     case GPGME_DATA_TYPE_PGP_KEY      : s = "PGP-key"; break;
54     case GPGME_DATA_TYPE_CMS_SIGNED   : s = "CMS-signed"; break;
55     case GPGME_DATA_TYPE_CMS_ENCRYPTED: s = "CMS-encrypted"; break;
56     case GPGME_DATA_TYPE_CMS_OTHER    : s = "CMS"; break;
57     case GPGME_DATA_TYPE_X509_CERT    : s = "X.509"; break;
58     case GPGME_DATA_TYPE_PKCS12       : s = "PKCS12"; break;
59     }
60   return s;
61 }
62
63
64 static int
65 show_usage (int ex)
66 {
67   fputs ("usage: " PGM " [options] FILENAMEs\n\n"
68          "Options:\n"
69          "  --verbose        run in verbose mode\n"
70          , stderr);
71   exit (ex);
72 }
73
74 int
75 main (int argc, char **argv)
76 {
77   int last_argc = -1;
78   gpgme_error_t err;
79   int anyerr = 0;
80   gpgme_data_t data;
81   gpgme_data_type_t dt;
82
83   if (argc)
84     { argc--; argv++; }
85   while (argc && last_argc != argc )
86     {
87       last_argc = argc;
88       if (!strcmp (*argv, "--"))
89         {
90           argc--; argv++;
91           break;
92         }
93       else if (!strcmp (*argv, "--help"))
94         show_usage (0);
95       else if (!strcmp (*argv, "--verbose"))
96         {
97           verbose = 1;
98           argc--; argv++;
99         }
100       else if (!strncmp (*argv, "--", 2))
101         show_usage (1);
102
103     }
104
105   init_gpgme (GPGME_PROTOCOL_OpenPGP);
106
107   for (; argc; argc--, argv++)
108     {
109       if (verbose)
110         printf ("reading file `%s'\n", *argv);
111       err = gpgme_data_new_from_file (&data, *argv, 1);
112       if (err)
113         {
114           fprintf (stderr, PGM ": error reading '%s': %s\n",
115                    *argv, gpg_strerror (err));
116           anyerr = 1;
117         }
118       else
119         {
120           dt = gpgme_data_identify (data, 0);
121           if (dt == GPGME_DATA_TYPE_INVALID)
122             anyerr = 1;
123           printf ("%s: %s\n", *argv, data_type_to_string (dt));
124           gpgme_data_release (data);
125         }
126     }
127
128   return anyerr;
129 }