aad94cb7c3
* src/gpgme.h.in (gpgme_query_swdb_result_t): New. (gpgme_op_query_swdb): New. (gpgme_op_query_swdb_result): New. * src/libgpgme.vers, src/gpgme.def: Add the two new functions. * src/queryswdb.c: New. * src/Makefile.am (main_sources): Add new file. * src/context.h (OPDATA_QUERY_SWDB): New. * src/engine-backend.h (struct engine_ops): Add field 'query_swdb'. Adjust all initializer. * src/engine.c (_gpgme_engine_op_query_swdb): New. * src/engine-gpgconf.c (parse_swdb_line): New. (gpgconf_query_swdb): New. (_gpgme_engine_ops_gpgconf): Register that function. * src/util.h (GPG_ERR_TOO_OLD): Define for older libgpg-error. (GPG_ERR_ENGINE_TOO_OLD): Ditto. * tests/run-swdb.c: New. * tests/Makefile.am (noinst_PROGRAMS): Add new debug tool. Signed-off-by: Werner Koch <wk@gnupg.org>
122 lines
3.0 KiB
C
122 lines
3.0 KiB
C
/* queryswdb.c - Access to the SWDB file
|
||
* Copyright (C) 2016 g10 Code GmbH
|
||
*
|
||
* This file is part of GPGME.
|
||
*
|
||
* GPGME is free software; you can redistribute it and/or modify it
|
||
* under the terms of the GNU Lesser General Public License as
|
||
* published by the Free Software Foundation; either version 2.1 of
|
||
* the License, or (at your option) any later version.
|
||
*
|
||
* GPGME is distributed in the hope that it will be useful, but
|
||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
* Lesser General Public License for more details.
|
||
*
|
||
* You should have received a copy of the GNU Lesser General Public
|
||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||
*/
|
||
|
||
#if HAVE_CONFIG_H
|
||
#include <config.h>
|
||
#endif
|
||
#include <stdlib.h>
|
||
#include <assert.h>
|
||
|
||
#include "gpgme.h"
|
||
#include "debug.h"
|
||
#include "context.h"
|
||
#include "ops.h"
|
||
|
||
|
||
typedef struct
|
||
{
|
||
struct _gpgme_op_query_swdb_result result;
|
||
|
||
} *op_data_t;
|
||
|
||
|
||
|
||
static void
|
||
release_op_data (void *hook)
|
||
{
|
||
op_data_t opd = (op_data_t) hook;
|
||
gpgme_query_swdb_result_t result = &opd->result;
|
||
|
||
assert (!result->next);
|
||
free (result->name);
|
||
free (result->iversion);
|
||
free (result->version);
|
||
}
|
||
|
||
|
||
gpgme_query_swdb_result_t
|
||
gpgme_op_query_swdb_result (gpgme_ctx_t ctx)
|
||
{
|
||
void *hook;
|
||
op_data_t opd;
|
||
gpgme_error_t err;
|
||
|
||
TRACE_BEG (DEBUG_CTX, "gpgme_op_query_swdb_result", ctx);
|
||
|
||
err = _gpgme_op_data_lookup (ctx, OPDATA_QUERY_SWDB, &hook, -1, NULL);
|
||
opd = hook;
|
||
|
||
if (err || !opd)
|
||
{
|
||
TRACE_SUC0 ("result=(null)");
|
||
return NULL;
|
||
}
|
||
|
||
TRACE_SUC1 ("result=%p", &opd->result);
|
||
return &opd->result;
|
||
}
|
||
|
||
|
||
|
||
/* Query the swdb for software package NAME and check against the
|
||
* installed version given by IVERSION. If IVERSION is NULL a check
|
||
* is only done if GPGME can figure out the version by itself
|
||
* (e.g. for "gpgme" or "gnupg"). RESERVED should be 0.
|
||
*
|
||
* Note that we only implemented the synchronous variant of this
|
||
* function but the API is prepared for an asynchronous variant.
|
||
*/
|
||
gpgme_error_t
|
||
gpgme_op_query_swdb (gpgme_ctx_t ctx, const char *name, const char *iversion,
|
||
unsigned int reserved)
|
||
{
|
||
gpgme_error_t err;
|
||
void *hook;
|
||
op_data_t opd;
|
||
|
||
TRACE_BEG2 (DEBUG_CTX, "gpgme_op_query_swdb", ctx,
|
||
"name=%s, iversion=%a", name, iversion);
|
||
|
||
if (!ctx || reserved)
|
||
return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
|
||
|
||
if (ctx->protocol != GPGME_PROTOCOL_GPGCONF)
|
||
return TRACE_ERR (gpg_error (GPG_ERR_UNSUPPORTED_PROTOCOL));
|
||
|
||
if (!name)
|
||
name = "gpgme";
|
||
|
||
if (!iversion && !strcmp (name, "gpgme"))
|
||
iversion = VERSION;
|
||
|
||
err = _gpgme_op_reset (ctx, 1);
|
||
if (err)
|
||
return err;
|
||
|
||
err = _gpgme_op_data_lookup (ctx, OPDATA_QUERY_SWDB, &hook,
|
||
sizeof (*opd), release_op_data);
|
||
opd = hook;
|
||
if (err)
|
||
return TRACE_ERR (err);
|
||
|
||
err = _gpgme_engine_op_query_swdb (ctx->engine, name, iversion,
|
||
&opd->result);
|
||
return TRACE_ERR (err);
|
||
}
|