g10: Add new delete operations that allow more flags.
[gpgme.git] / src / queryswdb.c
1 /* queryswdb.c - Access to the SWDB file
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://www.gnu.org/licenses/>.
18  */
19
20 #if HAVE_CONFIG_H
21 #include <config.h>
22 #endif
23 #include <stdlib.h>
24 #include <assert.h>
25
26 #include "gpgme.h"
27 #include "debug.h"
28 #include "context.h"
29 #include "ops.h"
30
31
32 typedef struct
33 {
34   struct _gpgme_op_query_swdb_result result;
35
36 } *op_data_t;
37
38
39 \f
40 static void
41 release_op_data (void *hook)
42 {
43   op_data_t opd = (op_data_t) hook;
44   gpgme_query_swdb_result_t result = &opd->result;
45
46   assert (!result->next);
47   free (result->name);
48   free (result->iversion);
49   free (result->version);
50 }
51
52
53 gpgme_query_swdb_result_t
54 gpgme_op_query_swdb_result (gpgme_ctx_t ctx)
55 {
56   void *hook;
57   op_data_t opd;
58   gpgme_error_t err;
59
60   TRACE_BEG (DEBUG_CTX, "gpgme_op_query_swdb_result", ctx);
61
62   err = _gpgme_op_data_lookup (ctx, OPDATA_QUERY_SWDB, &hook, -1, NULL);
63   opd = hook;
64
65   if (err || !opd)
66     {
67       TRACE_SUC0 ("result=(null)");
68       return NULL;
69     }
70
71   TRACE_SUC1 ("result=%p", &opd->result);
72   return &opd->result;
73 }
74
75
76
77 /* Query the swdb for software package NAME and check against the
78  * installed version given by IVERSION.  If IVERSION is NULL a check
79  * is only done if GPGME can figure out the version by itself
80  * (e.g. for "gpgme" or "gnupg").  RESERVED should be 0.
81  *
82  * Note that we only implemented the synchronous variant of this
83  * function but the API is prepared for an asynchronous variant.
84  */
85 gpgme_error_t
86 gpgme_op_query_swdb (gpgme_ctx_t ctx, const char *name, const char *iversion,
87                      unsigned int reserved)
88 {
89   gpgme_error_t err;
90   void *hook;
91   op_data_t opd;
92
93   TRACE_BEG2 (DEBUG_CTX, "gpgme_op_query_swdb", ctx,
94               "name=%s, iversion=%a", name, iversion);
95
96   if (!ctx || reserved)
97     return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
98
99   if (ctx->protocol != GPGME_PROTOCOL_GPGCONF)
100     return TRACE_ERR (gpg_error (GPG_ERR_UNSUPPORTED_PROTOCOL));
101
102   if (!name)
103     name = "gpgme";
104
105   if (!iversion && !strcmp (name, "gpgme"))
106     iversion = VERSION;
107
108   err = _gpgme_op_reset (ctx, 1);
109   if (err)
110     return err;
111
112   err = _gpgme_op_data_lookup (ctx, OPDATA_QUERY_SWDB, &hook,
113                                sizeof (*opd), release_op_data);
114   opd = hook;
115   if (err)
116     return TRACE_ERR (err);
117
118   err = _gpgme_engine_op_query_swdb (ctx->engine, name, iversion,
119                                      &opd->result);
120   return TRACE_ERR (err);
121 }