Blame src/engine.c

Packit Service 672cf4
/* engine.c - GPGME engine support.
Packit Service 6c01f9
   Copyright (C) 2000 Werner Koch (dd9jn)
Packit Service 6c01f9
   Copyright (C) 2001, 2002, 2003, 2004, 2006, 2009, 2010 g10 Code GmbH
Packit Service 6c01f9
Packit Service 6c01f9
   This file is part of GPGME.
Packit Service 6c01f9
Packit Service 6c01f9
   GPGME is free software; you can redistribute it and/or modify it
Packit Service 6c01f9
   under the terms of the GNU Lesser General Public License as
Packit Service 6c01f9
   published by the Free Software Foundation; either version 2.1 of
Packit Service 6c01f9
   the License, or (at your option) any later version.
Packit Service 6c01f9
Packit Service 6c01f9
   GPGME is distributed in the hope that it will be useful, but
Packit Service 6c01f9
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 6c01f9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 6c01f9
   Lesser General Public License for more details.
Packit Service 6c01f9
Packit Service 6c01f9
   You should have received a copy of the GNU Lesser General Public
Packit Service 6c01f9
   License along with this program; if not, see <https://www.gnu.org/licenses/>.
Packit Service 6c01f9
*/
Packit Service 672cf4
Packit Service 672cf4
#ifdef HAVE_CONFIG_H
Packit Service 672cf4
#include <config.h>
Packit Service 672cf4
#endif
Packit Service 672cf4
#include <stdlib.h>
Packit Service 672cf4
#include <string.h>
Packit Service 672cf4
#include <errno.h>
Packit Service 672cf4
#include <assert.h>
Packit Service 672cf4
Packit Service 672cf4
#include "gpgme.h"
Packit Service 672cf4
#include "util.h"
Packit Service 672cf4
#include "sema.h"
Packit Service 672cf4
#include "ops.h"
Packit Service 672cf4
#include "debug.h"
Packit Service 672cf4
Packit Service 672cf4
#include "engine.h"
Packit Service 672cf4
#include "engine-backend.h"
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
struct engine
Packit Service 672cf4
{
Packit Service 672cf4
  struct engine_ops *ops;
Packit Service 672cf4
  void *engine;
Packit Service 672cf4
};
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
static struct engine_ops *engine_ops[] =
Packit Service 672cf4
  {
Packit Service 672cf4
    &_gpgme_engine_ops_gpg,		/* OpenPGP.  */
Packit Service 672cf4
    &_gpgme_engine_ops_gpgsm,		/* CMS.  */
Packit Service 672cf4
    &_gpgme_engine_ops_gpgconf,		/* gpg-conf.  */
Packit Service 672cf4
    &_gpgme_engine_ops_assuan,		/* Low-Level Assuan.  */
Packit Service 672cf4
    &_gpgme_engine_ops_g13,		/* Crypto VFS.  */
Packit Service 672cf4
#ifdef ENABLE_UISERVER
Packit Service 672cf4
    &_gpgme_engine_ops_uiserver,	/* UI-Server.  */
Packit Service 672cf4
#else
Packit Service 672cf4
    NULL,
Packit Service 672cf4
#endif
Packit Service 672cf4
    &_gpgme_engine_ops_spawn
Packit Service 672cf4
  };
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* The engine info.  */
Packit Service 672cf4
static gpgme_engine_info_t engine_info;
Packit Service 672cf4
DEFINE_STATIC_LOCK (engine_info_lock);
Packit Service 672cf4
Packit Service 672cf4
/* If non-NULL, the minimal version required for all engines.  */
Packit Service 672cf4
static char *engine_minimal_version;
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4

Packit Service 672cf4
/* Get the file name of the engine for PROTOCOL.  */
Packit Service 672cf4
static const char *
Packit Service 672cf4
engine_get_file_name (gpgme_protocol_t proto)
Packit Service 672cf4
{
Packit Service 672cf4
  if (proto > DIM (engine_ops))
Packit Service 672cf4
    return NULL;
Packit Service 672cf4
Packit Service 672cf4
  if (engine_ops[proto] && engine_ops[proto]->get_file_name)
Packit Service 672cf4
    return (*engine_ops[proto]->get_file_name) ();
Packit Service 672cf4
  else
Packit Service 672cf4
    return NULL;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* Get the standard home dir of the engine for PROTOCOL.  */
Packit Service 672cf4
static const char *
Packit Service 672cf4
engine_get_home_dir (gpgme_protocol_t proto)
Packit Service 672cf4
{
Packit Service 672cf4
  if (proto > DIM (engine_ops))
Packit Service 672cf4
    return NULL;
Packit Service 672cf4
Packit Service 672cf4
  if (engine_ops[proto] && engine_ops[proto]->get_home_dir)
Packit Service 672cf4
    return (*engine_ops[proto]->get_home_dir) ();
Packit Service 672cf4
  else
Packit Service 672cf4
    return NULL;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* Get a malloced string containing the version number of the engine
Packit Service 672cf4
 * for PROTOCOL.  If this function returns NULL for a valid protocol,
Packit Service 672cf4
 * it should be assumed that the engine is a pseudo engine. */
Packit Service 672cf4
static char *
Packit Service 672cf4
engine_get_version (gpgme_protocol_t proto, const char *file_name)
Packit Service 672cf4
{
Packit Service 672cf4
  if (proto > DIM (engine_ops))
Packit Service 672cf4
    return NULL;
Packit Service 672cf4
Packit Service 672cf4
  if (engine_ops[proto] && engine_ops[proto]->get_version)
Packit Service 672cf4
    return (*engine_ops[proto]->get_version) (file_name);
Packit Service 672cf4
  else
Packit Service 672cf4
    return NULL;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* Get the required version number of the engine for PROTOCOL.  This
Packit Service 672cf4
 * may be NULL. */
Packit Service 672cf4
static const char *
Packit Service 672cf4
engine_get_req_version (gpgme_protocol_t proto)
Packit Service 672cf4
{
Packit Service 672cf4
  if (proto > DIM (engine_ops))
Packit Service 672cf4
    return NULL;
Packit Service 672cf4
Packit Service 672cf4
  if (engine_ops[proto] && engine_ops[proto]->get_req_version)
Packit Service 672cf4
    return (*engine_ops[proto]->get_req_version) ();
Packit Service 672cf4
  else
Packit Service 672cf4
    return NULL;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* Verify the version requirement for the engine for PROTOCOL.  */
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
gpgme_engine_check_version (gpgme_protocol_t proto)
Packit Service 672cf4
{
Packit Service 672cf4
  gpgme_error_t err;
Packit Service 672cf4
  gpgme_engine_info_t info;
Packit Service 672cf4
  int result;
Packit Service 672cf4
Packit Service 672cf4
  LOCK (engine_info_lock);
Packit Service 672cf4
  info = engine_info;
Packit Service 672cf4
  if (!info)
Packit Service 672cf4
    {
Packit Service 672cf4
      /* Make sure it is initialized.  */
Packit Service 672cf4
      UNLOCK (engine_info_lock);
Packit Service 672cf4
      err = gpgme_get_engine_info (&info;;
Packit Service 672cf4
      if (err)
Packit Service 672cf4
	return err;
Packit Service 672cf4
Packit Service 672cf4
      LOCK (engine_info_lock);
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
  while (info && info->protocol != proto)
Packit Service 672cf4
    info = info->next;
Packit Service 672cf4
Packit Service 672cf4
  if (!info)
Packit Service 672cf4
    result = 0;
Packit Service 672cf4
  else
Packit Service 672cf4
    result = _gpgme_compare_versions (info->version,
Packit Service 672cf4
				      info->req_version);
Packit Service 672cf4
Packit Service 672cf4
  UNLOCK (engine_info_lock);
Packit Service 672cf4
  return result ? 0 : trace_gpg_error (GPG_ERR_INV_ENGINE);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* Release the engine info INFO.  */
Packit Service 672cf4
void
Packit Service 672cf4
_gpgme_engine_info_release (gpgme_engine_info_t info)
Packit Service 672cf4
{
Packit Service 672cf4
  while (info)
Packit Service 672cf4
    {
Packit Service 672cf4
      gpgme_engine_info_t next_info = info->next;
Packit Service 672cf4
Packit Service 672cf4
      if (info->file_name)
Packit Service 672cf4
        free (info->file_name);
Packit Service 672cf4
      if (info->home_dir)
Packit Service 672cf4
	free (info->home_dir);
Packit Service 672cf4
      if (info->version)
Packit Service 672cf4
	free (info->version);
Packit Service 672cf4
      free (info);
Packit Service 672cf4
      info = next_info;
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* This is an internal function to set a mimimal required version.
Packit Service 672cf4
 * This function must only be called by gpgme_set_global_flag.
Packit Service 672cf4
 * Returns 0 on success.  */
Packit Service 672cf4
int
Packit Service 672cf4
_gpgme_set_engine_minimal_version (const char *value)
Packit Service 672cf4
{
Packit Service 672cf4
  free (engine_minimal_version);
Packit Service 672cf4
  if (value)
Packit Service 672cf4
    {
Packit Service 672cf4
      engine_minimal_version = strdup (value);
Packit Service 672cf4
      return !engine_minimal_version;
Packit Service 672cf4
    }
Packit Service 672cf4
  else
Packit Service 672cf4
    {
Packit Service 672cf4
      engine_minimal_version = NULL;
Packit Service 672cf4
      return 0;
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* Get the information about the configured and installed engines.  A
Packit Service 672cf4
   pointer to the first engine in the statically allocated linked list
Packit Service 672cf4
   is returned in *INFO.  If an error occurs, it is returned.  The
Packit Service 672cf4
   returned data is valid until the next gpgme_set_engine_info.  */
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
gpgme_get_engine_info (gpgme_engine_info_t *info)
Packit Service 672cf4
{
Packit Service 672cf4
  gpgme_error_t err;
Packit Service 672cf4
Packit Service 672cf4
  LOCK (engine_info_lock);
Packit Service 672cf4
  if (!engine_info)
Packit Service 672cf4
    {
Packit Service 672cf4
      gpgme_engine_info_t *lastp = &engine_info;
Packit Service 672cf4
      gpgme_protocol_t proto_list[] = { GPGME_PROTOCOL_OpenPGP,
Packit Service 672cf4
					GPGME_PROTOCOL_CMS,
Packit Service 672cf4
					GPGME_PROTOCOL_GPGCONF,
Packit Service 672cf4
					GPGME_PROTOCOL_ASSUAN,
Packit Service 672cf4
					GPGME_PROTOCOL_G13,
Packit Service 672cf4
					GPGME_PROTOCOL_UISERVER,
Packit Service 672cf4
                                        GPGME_PROTOCOL_SPAWN    };
Packit Service 672cf4
      unsigned int proto;
Packit Service 672cf4
Packit Service 672cf4
      err = 0;
Packit Service 672cf4
      for (proto = 0; proto < DIM (proto_list); proto++)
Packit Service 672cf4
	{
Packit Service 672cf4
	  const char *ofile_name = engine_get_file_name (proto_list[proto]);
Packit Service 672cf4
	  const char *ohome_dir  = engine_get_home_dir (proto_list[proto]);
Packit Service 672cf4
          char *version = engine_get_version (proto_list[proto], NULL);
Packit Service 672cf4
	  char *file_name;
Packit Service 672cf4
	  char *home_dir;
Packit Service 672cf4
Packit Service 672cf4
	  if (!ofile_name)
Packit Service 672cf4
	    continue;
Packit Service 672cf4
Packit Service 672cf4
	  file_name = strdup (ofile_name);
Packit Service 672cf4
          if (!file_name)
Packit Service 672cf4
            err = gpg_error_from_syserror ();
Packit Service 672cf4
Packit Service 672cf4
          if (ohome_dir)
Packit Service 672cf4
            {
Packit Service 672cf4
              home_dir = strdup (ohome_dir);
Packit Service 672cf4
              if (!home_dir && !err)
Packit Service 672cf4
                err = gpg_error_from_syserror ();
Packit Service 672cf4
            }
Packit Service 672cf4
          else
Packit Service 672cf4
            home_dir = NULL;
Packit Service 672cf4
Packit Service 672cf4
	  *lastp = calloc (1, sizeof (*engine_info));
Packit Service 672cf4
          if (!*lastp && !err)
Packit Service 672cf4
            err = gpg_error_from_syserror ();
Packit Service 672cf4
Packit Service 672cf4
          /* Check against the optional minimal engine version.  */
Packit Service 672cf4
          if (!err && version && engine_minimal_version
Packit Service 672cf4
              && !_gpgme_compare_versions (version, engine_minimal_version))
Packit Service 672cf4
            {
Packit Service 672cf4
#if GPG_ERROR_VERSION_NUMBER < 0x011900 /* 1.25 */
Packit Service 672cf4
              err = gpg_error (GPG_ERR_NO_ENGINE);
Packit Service 672cf4
#else
Packit Service 672cf4
              err = gpg_error (GPG_ERR_ENGINE_TOO_OLD);
Packit Service 672cf4
#endif
Packit Service 672cf4
            }
Packit Service 672cf4
Packit Service 672cf4
          /* Now set the dummy version for pseudo engines.  */
Packit Service 672cf4
          if (!err && !version)
Packit Service 672cf4
            {
Packit Service 672cf4
              version = strdup ("1.0.0");
Packit Service 672cf4
              if (!version)
Packit Service 672cf4
                err = gpg_error_from_syserror ();
Packit Service 672cf4
            }
Packit Service 672cf4
Packit Service 672cf4
	  if (err)
Packit Service 672cf4
	    {
Packit Service 672cf4
	      _gpgme_engine_info_release (engine_info);
Packit Service 672cf4
	      engine_info = NULL;
Packit Service 672cf4
Packit Service 672cf4
	      if (file_name)
Packit Service 672cf4
		free (file_name);
Packit Service 672cf4
	      if (home_dir)
Packit Service 672cf4
		free (home_dir);
Packit Service 672cf4
	      if (version)
Packit Service 672cf4
		free (version);
Packit Service 672cf4
Packit Service 672cf4
	      UNLOCK (engine_info_lock);
Packit Service 672cf4
	      return err;
Packit Service 672cf4
	    }
Packit Service 672cf4
Packit Service 672cf4
	  (*lastp)->protocol = proto_list[proto];
Packit Service 672cf4
	  (*lastp)->file_name = file_name;
Packit Service 672cf4
	  (*lastp)->home_dir = home_dir;
Packit Service 672cf4
	  (*lastp)->version = version;
Packit Service 672cf4
	  (*lastp)->req_version = engine_get_req_version (proto_list[proto]);
Packit Service 672cf4
	  if (!(*lastp)->req_version)
Packit Service 672cf4
            (*lastp)->req_version = "1.0.0"; /* Dummy for pseudo engines. */
Packit Service 672cf4
	  (*lastp)->next = NULL;
Packit Service 672cf4
	  lastp = &(*lastp)->next;
Packit Service 672cf4
	}
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
  *info = engine_info;
Packit Service 672cf4
  UNLOCK (engine_info_lock);
Packit Service 672cf4
  return 0;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* Get a deep copy of the engine info and return it in INFO.  */
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_info_copy (gpgme_engine_info_t *r_info)
Packit Service 672cf4
{
Packit Service 672cf4
  gpgme_error_t err = 0;
Packit Service 672cf4
  gpgme_engine_info_t info;
Packit Service 672cf4
  gpgme_engine_info_t new_info;
Packit Service 672cf4
  gpgme_engine_info_t *lastp;
Packit Service 672cf4
Packit Service 672cf4
  LOCK (engine_info_lock);
Packit Service 672cf4
  info = engine_info;
Packit Service 672cf4
  if (!info)
Packit Service 672cf4
    {
Packit Service 672cf4
      /* Make sure it is initialized.  */
Packit Service 672cf4
      UNLOCK (engine_info_lock);
Packit Service 672cf4
      err = gpgme_get_engine_info (&info;;
Packit Service 672cf4
      if (err)
Packit Service 672cf4
	return err;
Packit Service 672cf4
Packit Service 672cf4
      LOCK (engine_info_lock);
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
  new_info = NULL;
Packit Service 672cf4
  lastp = &new_info;
Packit Service 672cf4
Packit Service 672cf4
  while (info)
Packit Service 672cf4
    {
Packit Service 672cf4
      char *file_name;
Packit Service 672cf4
      char *home_dir;
Packit Service 672cf4
      char *version;
Packit Service 672cf4
Packit Service 672cf4
      assert (info->file_name);
Packit Service 672cf4
      file_name = strdup (info->file_name);
Packit Service 672cf4
      if (!file_name)
Packit Service 672cf4
        err = gpg_error_from_syserror ();
Packit Service 672cf4
Packit Service 672cf4
      if (info->home_dir)
Packit Service 672cf4
	{
Packit Service 672cf4
	  home_dir = strdup (info->home_dir);
Packit Service 672cf4
	  if (!home_dir && !err)
Packit Service 672cf4
	    err = gpg_error_from_syserror ();
Packit Service 672cf4
	}
Packit Service 672cf4
      else
Packit Service 672cf4
	home_dir = NULL;
Packit Service 672cf4
Packit Service 672cf4
      if (info->version)
Packit Service 672cf4
	{
Packit Service 672cf4
	  version = strdup (info->version);
Packit Service 672cf4
	  if (!version && !err)
Packit Service 672cf4
	    err = gpg_error_from_syserror ();
Packit Service 672cf4
	}
Packit Service 672cf4
      else
Packit Service 672cf4
	version = NULL;
Packit Service 672cf4
Packit Service 672cf4
      *lastp = malloc (sizeof (*engine_info));
Packit Service 672cf4
      if (!*lastp && !err)
Packit Service 672cf4
        err = gpg_error_from_syserror ();
Packit Service 672cf4
Packit Service 672cf4
      if (err)
Packit Service 672cf4
	{
Packit Service 672cf4
	  _gpgme_engine_info_release (new_info);
Packit Service 672cf4
	  if (file_name)
Packit Service 672cf4
	    free (file_name);
Packit Service 672cf4
	  if (home_dir)
Packit Service 672cf4
	    free (home_dir);
Packit Service 672cf4
	  if (version)
Packit Service 672cf4
	    free (version);
Packit Service 672cf4
Packit Service 672cf4
	  UNLOCK (engine_info_lock);
Packit Service 672cf4
	  return err;
Packit Service 672cf4
	}
Packit Service 672cf4
Packit Service 672cf4
      (*lastp)->protocol = info->protocol;
Packit Service 672cf4
      (*lastp)->file_name = file_name;
Packit Service 672cf4
      (*lastp)->home_dir = home_dir;
Packit Service 672cf4
      (*lastp)->version = version;
Packit Service 672cf4
      (*lastp)->req_version = info->req_version;
Packit Service 672cf4
      (*lastp)->next = NULL;
Packit Service 672cf4
      lastp = &(*lastp)->next;
Packit Service 672cf4
Packit Service 672cf4
      info = info->next;
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
  *r_info = new_info;
Packit Service 672cf4
  UNLOCK (engine_info_lock);
Packit Service 672cf4
  return 0;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* Set the engine info for the info list INFO, protocol PROTO, to the
Packit Service 672cf4
   file name FILE_NAME and the home directory HOME_DIR.  */
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_set_engine_info (gpgme_engine_info_t info, gpgme_protocol_t proto,
Packit Service 672cf4
			const char *file_name, const char *home_dir)
Packit Service 672cf4
{
Packit Service 672cf4
  char *new_file_name;
Packit Service 672cf4
  char *new_home_dir;
Packit Service 672cf4
  char *new_version;
Packit Service 672cf4
Packit Service 672cf4
  /* FIXME: Use some PROTO_MAX definition.  */
Packit Service 672cf4
  if (proto > DIM (engine_ops))
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  while (info && info->protocol != proto)
Packit Service 672cf4
    info = info->next;
Packit Service 672cf4
Packit Service 672cf4
  if (!info)
Packit Service 672cf4
    return trace_gpg_error (GPG_ERR_INV_ENGINE);
Packit Service 672cf4
Packit Service 672cf4
  /* Prepare new members.  */
Packit Service 672cf4
  if (file_name)
Packit Service 672cf4
    new_file_name = strdup (file_name);
Packit Service 672cf4
  else
Packit Service 672cf4
    {
Packit Service 672cf4
      const char *ofile_name = engine_get_file_name (proto);
Packit Service 672cf4
      assert (ofile_name);
Packit Service 672cf4
      new_file_name = strdup (ofile_name);
Packit Service 672cf4
    }
Packit Service 672cf4
  if (!new_file_name)
Packit Service 672cf4
    return gpg_error_from_syserror ();
Packit Service 672cf4
Packit Service 672cf4
  if (home_dir)
Packit Service 672cf4
    {
Packit Service 672cf4
      new_home_dir = strdup (home_dir);
Packit Service 672cf4
      if (!new_home_dir)
Packit Service 672cf4
	{
Packit Service 672cf4
	  free (new_file_name);
Packit Service 672cf4
	  return gpg_error_from_syserror ();
Packit Service 672cf4
	}
Packit Service 672cf4
    }
Packit Service 672cf4
  else
Packit Service 672cf4
    {
Packit Service 672cf4
      const char *ohome_dir = engine_get_home_dir (proto);
Packit Service 672cf4
      if (ohome_dir)
Packit Service 672cf4
        {
Packit Service 672cf4
          new_home_dir = strdup (ohome_dir);
Packit Service 672cf4
          if (!new_home_dir)
Packit Service 672cf4
            {
Packit Service 672cf4
              free (new_file_name);
Packit Service 672cf4
              return gpg_error_from_syserror ();
Packit Service 672cf4
            }
Packit Service 672cf4
        }
Packit Service 672cf4
      else
Packit Service 672cf4
        new_home_dir = NULL;
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
  new_version = engine_get_version (proto, new_file_name);
Packit Service 672cf4
  if (!new_version)
Packit Service 672cf4
    {
Packit Service 672cf4
      new_version = strdup ("1.0.0"); /* Fake one for dummy entries.  */
Packit Service 672cf4
      if (!new_version)
Packit Service 672cf4
        {
Packit Service 672cf4
          free (new_file_name);
Packit Service 6c01f9
          free (new_home_dir);
Packit Service 672cf4
        }
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
  /* Remove the old members.  */
Packit Service 672cf4
  assert (info->file_name);
Packit Service 672cf4
  free (info->file_name);
Packit Service 672cf4
  if (info->home_dir)
Packit Service 672cf4
    free (info->home_dir);
Packit Service 672cf4
  if (info->version)
Packit Service 672cf4
    free (info->version);
Packit Service 672cf4
Packit Service 672cf4
  /* Install the new members.  */
Packit Service 672cf4
  info->file_name = new_file_name;
Packit Service 672cf4
  info->home_dir = new_home_dir;
Packit Service 672cf4
  info->version = new_version;
Packit Service 672cf4
Packit Service 672cf4
  return 0;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* Set the default engine info for the protocol PROTO to the file name
Packit Service 672cf4
   FILE_NAME and the home directory HOME_DIR.  */
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
gpgme_set_engine_info (gpgme_protocol_t proto,
Packit Service 672cf4
		       const char *file_name, const char *home_dir)
Packit Service 672cf4
{
Packit Service 672cf4
  gpgme_error_t err;
Packit Service 672cf4
  gpgme_engine_info_t info;
Packit Service 672cf4
Packit Service 672cf4
  LOCK (engine_info_lock);
Packit Service 672cf4
  info = engine_info;
Packit Service 672cf4
  if (!info)
Packit Service 672cf4
    {
Packit Service 672cf4
      /* Make sure it is initialized.  */
Packit Service 672cf4
      UNLOCK (engine_info_lock);
Packit Service 672cf4
      err = gpgme_get_engine_info (&info;;
Packit Service 672cf4
      if (err)
Packit Service 672cf4
	return err;
Packit Service 672cf4
Packit Service 672cf4
      LOCK (engine_info_lock);
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
  err = _gpgme_set_engine_info (info, proto, file_name, home_dir);
Packit Service 672cf4
  UNLOCK (engine_info_lock);
Packit Service 672cf4
  return err;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4

Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_new (gpgme_engine_info_t info, engine_t *r_engine)
Packit Service 672cf4
{
Packit Service 672cf4
  engine_t engine;
Packit Service 672cf4
Packit Service 672cf4
  if (!info->file_name || !info->version)
Packit Service 672cf4
    return trace_gpg_error (GPG_ERR_INV_ENGINE);
Packit Service 672cf4
Packit Service 672cf4
  engine = calloc (1, sizeof *engine);
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error_from_syserror ();
Packit Service 672cf4
Packit Service 672cf4
  engine->ops = engine_ops[info->protocol];
Packit Service 672cf4
  if (engine->ops->new)
Packit Service 672cf4
    {
Packit Service 672cf4
      gpgme_error_t err;
Packit Service 672cf4
      err = (*engine->ops->new) (&engine->engine,
Packit Service 672cf4
				 info->file_name, info->home_dir,
Packit Service 672cf4
                                 info->version);
Packit Service 672cf4
      if (err)
Packit Service 672cf4
	{
Packit Service 672cf4
	  free (engine);
Packit Service 672cf4
	  return err;
Packit Service 672cf4
	}
Packit Service 672cf4
    }
Packit Service 672cf4
  else
Packit Service 672cf4
    engine->engine = NULL;
Packit Service 672cf4
Packit Service 672cf4
  *r_engine = engine;
Packit Service 672cf4
  return 0;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_reset (engine_t engine)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->reset)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->reset) (engine->engine);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
void
Packit Service 672cf4
_gpgme_engine_release (engine_t engine)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return;
Packit Service 672cf4
Packit Service 672cf4
  if (engine->ops->release)
Packit Service 672cf4
    (*engine->ops->release) (engine->engine);
Packit Service 672cf4
  free (engine);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* Set a status callback which is used to monitor the status values
Packit Service 672cf4
 * before they are passed to a handler set with
Packit Service 672cf4
 * _gpgme_engine_set_status_handler.  */
Packit Service 672cf4
void
Packit Service 672cf4
_gpgme_engine_set_status_cb (engine_t engine,
Packit Service 672cf4
                             gpgme_status_cb_t cb, void *cb_value)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return;
Packit Service 672cf4
Packit Service 672cf4
  if (engine->ops->set_status_cb)
Packit Service 672cf4
    (*engine->ops->set_status_cb) (engine->engine, cb, cb_value);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
void
Packit Service 672cf4
_gpgme_engine_set_status_handler (engine_t engine,
Packit Service 672cf4
				  engine_status_handler_t fnc, void *fnc_value)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return;
Packit Service 672cf4
Packit Service 672cf4
  if (engine->ops->set_status_handler)
Packit Service 672cf4
    (*engine->ops->set_status_handler) (engine->engine, fnc, fnc_value);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_set_command_handler (engine_t engine,
Packit Service 672cf4
				   engine_command_handler_t fnc,
Packit Service 6c01f9
				   void *fnc_value,
Packit Service 6c01f9
				   gpgme_data_t linked_data)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->set_command_handler)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 6c01f9
  return (*engine->ops->set_command_handler) (engine->engine,
Packit Service 6c01f9
					      fnc, fnc_value, linked_data);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_set_colon_line_handler (engine_t engine,
Packit Service 672cf4
				      engine_colon_line_handler_t fnc,
Packit Service 672cf4
				      void *fnc_value)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->set_colon_line_handler)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->set_colon_line_handler) (engine->engine,
Packit Service 672cf4
						 fnc, fnc_value);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_set_locale (engine_t engine, int category,
Packit Service 672cf4
			  const char *value)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->set_locale)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->set_locale) (engine->engine, category, value);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_set_protocol (engine_t engine, gpgme_protocol_t protocol)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->set_protocol)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->set_protocol) (engine->engine, protocol);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_decrypt (engine_t engine,
Packit Service 672cf4
                          gpgme_decrypt_flags_t flags,
Packit Service 672cf4
                          gpgme_data_t ciph,
Packit Service 672cf4
			  gpgme_data_t plain, int export_session_key,
Packit Service 672cf4
                          const char *override_session_key,
Packit Service 672cf4
                          int auto_key_retrieve)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->decrypt)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->decrypt) (engine->engine, flags, ciph, plain,
Packit Service 672cf4
                                  export_session_key, override_session_key,
Packit Service 672cf4
                                  auto_key_retrieve);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_delete (engine_t engine, gpgme_key_t key,
Packit Service 672cf4
			 unsigned int flags)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->delete)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->delete) (engine->engine, key, flags);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_edit (engine_t engine, int type, gpgme_key_t key,
Packit Service 672cf4
		       gpgme_data_t out, gpgme_ctx_t ctx /* FIXME */)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->edit)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->edit) (engine->engine, type, key, out, ctx);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_encrypt (engine_t engine, gpgme_key_t recp[],
Packit Service 672cf4
			  gpgme_encrypt_flags_t flags,
Packit Service 672cf4
			  gpgme_data_t plain, gpgme_data_t ciph, int use_armor)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->encrypt)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 6c01f9
  return (*engine->ops->encrypt) (engine->engine, recp, flags, plain, ciph,
Packit Service 6c01f9
				  use_armor);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_encrypt_sign (engine_t engine, gpgme_key_t recp[],
Packit Service 672cf4
			       gpgme_encrypt_flags_t flags,
Packit Service 672cf4
			       gpgme_data_t plain, gpgme_data_t ciph,
Packit Service 672cf4
			       int use_armor, gpgme_ctx_t ctx /* FIXME */)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->encrypt_sign)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 6c01f9
  return (*engine->ops->encrypt_sign) (engine->engine, recp, flags,
Packit Service 6c01f9
				       plain, ciph, use_armor, ctx);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_export (engine_t engine, const char *pattern,
Packit Service 672cf4
			 gpgme_export_mode_t mode, gpgme_data_t keydata,
Packit Service 672cf4
			 int use_armor)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->export)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->export) (engine->engine, pattern, mode,
Packit Service 672cf4
				 keydata, use_armor);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_export_ext (engine_t engine, const char *pattern[],
Packit Service 672cf4
			     unsigned int reserved, gpgme_data_t keydata,
Packit Service 672cf4
			     int use_armor)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->export_ext)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->export_ext) (engine->engine, pattern, reserved,
Packit Service 672cf4
				     keydata, use_armor);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_genkey (engine_t engine,
Packit Service 672cf4
                         const char *userid, const char *algo,
Packit Service 672cf4
                         unsigned long reserved, unsigned long expires,
Packit Service 672cf4
                         gpgme_key_t key, unsigned int flags,
Packit Service 672cf4
                         gpgme_data_t help_data,
Packit Service 672cf4
			 unsigned int extraflags,
Packit Service 672cf4
                         gpgme_data_t pubkey, gpgme_data_t seckey)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->genkey)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->genkey) (engine->engine,
Packit Service 672cf4
                                 userid, algo, reserved, expires, key, flags,
Packit Service 672cf4
                                 help_data, extraflags,
Packit Service 672cf4
				 pubkey, seckey);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_keysign (engine_t engine, gpgme_key_t key, const char *userid,
Packit Service 672cf4
                          unsigned long expires, unsigned int flags,
Packit Service 672cf4
                          gpgme_ctx_t ctx)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->keysign)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->keysign) (engine->engine,
Packit Service 672cf4
                                  key, userid, expires, flags, ctx);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_tofu_policy (engine_t engine,
Packit Service 672cf4
                              gpgme_key_t key,  gpgme_tofu_policy_t policy)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->tofu_policy)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->tofu_policy) (engine->engine, key, policy);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_import (engine_t engine, gpgme_data_t keydata,
Packit Service 672cf4
                         gpgme_key_t *keyarray)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->import)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->import) (engine->engine, keydata, keyarray);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_keylist (engine_t engine, const char *pattern,
Packit Service 672cf4
			  int secret_only, gpgme_keylist_mode_t mode,
Packit Service 672cf4
			  int engine_flags)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->keylist)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->keylist) (engine->engine, pattern, secret_only, mode,
Packit Service 672cf4
                                  engine_flags);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_keylist_ext (engine_t engine, const char *pattern[],
Packit Service 672cf4
			      int secret_only, int reserved,
Packit Service 672cf4
			      gpgme_keylist_mode_t mode, int engine_flags)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->keylist_ext)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->keylist_ext) (engine->engine, pattern, secret_only,
Packit Service 672cf4
				      reserved, mode, engine_flags);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_keylist_data (engine_t engine, gpgme_data_t data)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->keylist_data)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->keylist_data) (engine->engine, data);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_sign (engine_t engine, gpgme_data_t in, gpgme_data_t out,
Packit Service 672cf4
		       gpgme_sig_mode_t mode, int use_armor,
Packit Service 672cf4
		       int use_textmode, int include_certs,
Packit Service 672cf4
		       gpgme_ctx_t ctx /* FIXME */)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->sign)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->sign) (engine->engine, in, out, mode, use_armor,
Packit Service 672cf4
			       use_textmode, include_certs, ctx);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_trustlist (engine_t engine, const char *pattern)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->trustlist)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->trustlist) (engine->engine, pattern);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_verify (engine_t engine, gpgme_data_t sig,
Packit Service 672cf4
			 gpgme_data_t signed_text, gpgme_data_t plaintext,
Packit Service 672cf4
                         gpgme_ctx_t ctx)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->verify)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->verify) (engine->engine, sig, signed_text, plaintext,
Packit Service 672cf4
                                 ctx);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_getauditlog (engine_t engine, gpgme_data_t output,
Packit Service 672cf4
                              unsigned int flags)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->getauditlog)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->getauditlog) (engine->engine, output, flags);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_assuan_transact (engine_t engine,
Packit Service 672cf4
                                  const char *command,
Packit Service 672cf4
                                  gpgme_assuan_data_cb_t data_cb,
Packit Service 672cf4
                                  void *data_cb_value,
Packit Service 672cf4
                                  gpgme_assuan_inquire_cb_t inq_cb,
Packit Service 672cf4
                                  void *inq_cb_value,
Packit Service 672cf4
                                  gpgme_assuan_status_cb_t status_cb,
Packit Service 672cf4
                                  void *status_cb_value)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->opassuan_transact)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->opassuan_transact) (engine->engine,
Packit Service 672cf4
                                            command,
Packit Service 672cf4
                                            data_cb, data_cb_value,
Packit Service 672cf4
                                            inq_cb, inq_cb_value,
Packit Service 672cf4
                                            status_cb, status_cb_value);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_conf_load (engine_t engine, gpgme_conf_comp_t *conf_p)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->conf_load)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->conf_load) (engine->engine, conf_p);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_conf_save (engine_t engine, gpgme_conf_comp_t conf)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->conf_save)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->conf_save) (engine->engine, conf);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_conf_dir (engine_t engine, const char *what, char **result)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->conf_dir)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->conf_dir) (engine->engine, what, result);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_query_swdb (engine_t engine,
Packit Service 672cf4
                             const char *name, const char *iversion,
Packit Service 672cf4
                             gpgme_query_swdb_result_t result)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->query_swdb)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->query_swdb) (engine->engine, name, iversion, result);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
void
Packit Service 672cf4
_gpgme_engine_set_io_cbs (engine_t engine, gpgme_io_cbs_t io_cbs)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return;
Packit Service 672cf4
Packit Service 672cf4
  (*engine->ops->set_io_cbs) (engine->engine, io_cbs);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
void
Packit Service 672cf4
_gpgme_engine_io_event (engine_t engine,
Packit Service 672cf4
			gpgme_event_io_t type, void *type_data)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return;
Packit Service 672cf4
Packit Service 672cf4
  (*engine->ops->io_event) (engine->engine, type, type_data);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* Cancel the session and the pending operation if any.  */
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_cancel (engine_t engine)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->cancel)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->cancel) (engine->engine);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* Cancel the pending operation, but not the complete session.  */
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_cancel_op (engine_t engine)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->cancel_op)
Packit Service 672cf4
    return 0;
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->cancel_op) (engine->engine);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* Change the passphrase for KEY.  */
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_passwd (engine_t engine, gpgme_key_t key,
Packit Service 672cf4
                         unsigned int flags)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->passwd)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->passwd) (engine->engine, key, flags);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
/* Set the pinentry mode for ENGINE to MODE.  */
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_set_pinentry_mode (engine_t engine, gpgme_pinentry_mode_t mode)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->set_pinentry_mode)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->set_pinentry_mode) (engine->engine, mode);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Packit Service 672cf4
gpgme_error_t
Packit Service 672cf4
_gpgme_engine_op_spawn (engine_t engine,
Packit Service 672cf4
                        const char *file, const char *argv[],
Packit Service 672cf4
                        gpgme_data_t datain,
Packit Service 672cf4
                        gpgme_data_t dataout, gpgme_data_t dataerr,
Packit Service 672cf4
                        unsigned int flags)
Packit Service 672cf4
{
Packit Service 672cf4
  if (!engine)
Packit Service 672cf4
    return gpg_error (GPG_ERR_INV_VALUE);
Packit Service 672cf4
Packit Service 672cf4
  if (!engine->ops->opspawn)
Packit Service 672cf4
    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
Packit Service 672cf4
Packit Service 672cf4
  return (*engine->ops->opspawn) (engine->engine, file, argv,
Packit Service 672cf4
                                  datain, dataout, dataerr, flags);
Packit Service 672cf4
}