core: Fix duplication of close_notify_handler for gpgsm.
[gpgme.git] / tests / run-swdb.c
1 /* run-swdb.c  - Test tool for SWDB function
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 #include <assert.h>
31
32 #include <gpgme.h>
33
34 #define PGM "run-swdb"
35
36 #include "run-support.h"
37
38
39 static int verbose;
40
41
42 static const char *
43 isotimestr (unsigned long value)
44 {
45   time_t t;
46   static char buffer[25+5];
47   struct tm *tp;
48
49   if (!value)
50     return "none";
51   t = value;
52
53   tp = gmtime (&t);
54   snprintf (buffer, sizeof buffer, "%04d-%02d-%02d %02d:%02d:%02d",
55             1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday,
56             tp->tm_hour, tp->tm_min, tp->tm_sec);
57   return buffer;
58 }
59
60
61 static int
62 show_usage (int ex)
63 {
64   fputs ("usage: " PGM " [options] NAME [VERSION]\n\n"
65          "Options:\n"
66          "  --verbose        run in verbose mode\n"
67          "  --status         print status lines from the backend\n"
68          , stderr);
69   exit (ex);
70 }
71
72
73 int
74 main (int argc, char **argv)
75 {
76   int last_argc = -1;
77   gpgme_error_t err;
78   gpgme_ctx_t ctx;
79   gpgme_protocol_t protocol = GPGME_PROTOCOL_GPGCONF;
80   const char *name;
81   const char *iversion;
82   gpgme_query_swdb_result_t result;
83
84   if (argc)
85     { argc--; argv++; }
86
87   while (argc && last_argc != argc )
88     {
89       last_argc = argc;
90       if (!strcmp (*argv, "--"))
91         {
92           argc--; argv++;
93           break;
94         }
95       else if (!strcmp (*argv, "--help"))
96         show_usage (0);
97       else if (!strcmp (*argv, "--verbose"))
98         {
99           verbose = 1;
100           argc--; argv++;
101         }
102       else if (!strncmp (*argv, "--", 2))
103         show_usage (1);
104     }
105
106   if (argc < 1 || argc > 2)
107     show_usage (1);
108   name = argv[0];
109   iversion = argc > 1? argv[1] : NULL;
110
111   init_gpgme (protocol);
112
113   err = gpgme_new (&ctx);
114   fail_if_err (err);
115   gpgme_set_protocol (ctx, protocol);
116
117   err = gpgme_op_query_swdb (ctx, name, iversion, 0);
118   if (err)
119     {
120       fprintf (stderr, PGM ": error querying swdb: %s\n", gpg_strerror (err));
121       exit (1);
122     }
123
124   result = gpgme_op_query_swdb_result (ctx);
125   if (!result)
126     {
127       fprintf (stderr, PGM ": error querying swdb: %s\n", "no result");
128       exit (1);
129     }
130
131   printf ("package ...: %s\n"
132           "iversion ..: %s\n"
133           "version ...: %s\n",
134           nonnull (result->name),
135           nonnull (result->iversion),
136           nonnull (result->version));
137   printf ("reldate ...: %s\n", isotimestr (result->reldate));
138   printf ("created ...: %s\n", isotimestr (result->created));
139   printf ("retrieved .: %s\n", isotimestr (result->retrieved));
140   printf ("flags .....:%s%s%s%s%s%s%s\n",
141           result->warning? " warning" : "",
142           result->update?  " update"  : "",
143           result->urgent?  " urgent"  : "",
144           result->unknown? " unknown" : "",
145           result->tooold?  " tooold"  : "",
146           result->noinfo?  " noinfo"  : "",
147           result->error?   " error"   : "" );
148
149
150   gpgme_release (ctx);
151   return 0;
152 }