cpp: Add wrapper for gpgme_set_global_flag
[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 <https://gnu.org/licenses/>.
18  * SPDX-License-Identifier: LGPL-2.1-or-later
19  */
20
21 /* We need to include config.h so that we know whether we are building
22    with large file system (LFS) support. */
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26
27 #include <stdlib.h>
28 #include <stdio.h>
29 #include <string.h>
30
31 #include <gpgme.h>
32
33 #define PGM "run-identify"
34
35 #include "run-support.h"
36
37
38 static int verbose;
39
40
41 static const char *
42 data_type_to_string (gpgme_data_type_t dt)
43 {
44   const char *s = "[?]";
45
46   switch (dt)
47     {
48     case GPGME_DATA_TYPE_INVALID      : s = "invalid"; break;
49     case GPGME_DATA_TYPE_UNKNOWN      : s = "unknown"; break;
50     case GPGME_DATA_TYPE_PGP_SIGNED   : s = "PGP-signed"; break;
51     case GPGME_DATA_TYPE_PGP_SIGNATURE: s = "PGP-signature"; break;
52     case GPGME_DATA_TYPE_PGP_ENCRYPTED: s = "PGP-encrypted"; break;
53     case GPGME_DATA_TYPE_PGP_OTHER    : s = "PGP"; break;
54     case GPGME_DATA_TYPE_PGP_KEY      : s = "PGP-key"; break;
55     case GPGME_DATA_TYPE_CMS_SIGNED   : s = "CMS-signed"; break;
56     case GPGME_DATA_TYPE_CMS_ENCRYPTED: s = "CMS-encrypted"; break;
57     case GPGME_DATA_TYPE_CMS_OTHER    : s = "CMS"; break;
58     case GPGME_DATA_TYPE_X509_CERT    : s = "X.509"; break;
59     case GPGME_DATA_TYPE_PKCS12       : s = "PKCS12"; break;
60     }
61   return s;
62 }
63
64
65 static int
66 show_usage (int ex)
67 {
68   fputs ("usage: " PGM " [options] FILENAMEs\n\n"
69          "Options:\n"
70          "  --verbose        run in verbose mode\n"
71          , stderr);
72   exit (ex);
73 }
74
75 int
76 main (int argc, char **argv)
77 {
78   int last_argc = -1;
79   gpgme_error_t err;
80   int anyerr = 0;
81   gpgme_data_t data;
82   gpgme_data_type_t dt;
83
84   if (argc)
85     { argc--; argv++; }
86   while (argc && last_argc != argc )
87     {
88       last_argc = argc;
89       if (!strcmp (*argv, "--"))
90         {
91           argc--; argv++;
92           break;
93         }
94       else if (!strcmp (*argv, "--help"))
95         show_usage (0);
96       else if (!strcmp (*argv, "--verbose"))
97         {
98           verbose = 1;
99           argc--; argv++;
100         }
101       else if (!strncmp (*argv, "--", 2))
102         show_usage (1);
103
104     }
105
106   init_gpgme_basic ();
107
108   for (; argc; argc--, argv++)
109     {
110       if (verbose)
111         printf ("reading file `%s'\n", *argv);
112       err = gpgme_data_new_from_file (&data, *argv, 1);
113       if (err)
114         {
115           fprintf (stderr, PGM ": error reading '%s': %s\n",
116                    *argv, gpg_strerror (err));
117           anyerr = 1;
118         }
119       else
120         {
121           dt = gpgme_data_identify (data, 0);
122           if (dt == GPGME_DATA_TYPE_INVALID)
123             anyerr = 1;
124           printf ("%s: %s\n", *argv, data_type_to_string (dt));
125           gpgme_data_release (data);
126         }
127     }
128
129   return anyerr;
130 }