diff options
| author | Werner Koch <[email protected]> | 2016-08-16 16:53:42 +0000 | 
|---|---|---|
| committer | Werner Koch <[email protected]> | 2016-08-16 16:53:42 +0000 | 
| commit | 8c09dd9989bcd434a8cb5997770cb8414b96bd5c (patch) | |
| tree | 165b40484f5182676f32356b2f6b26c81723a2ca /src | |
| parent | core: Simplify setting of dummy versions. (diff) | |
| download | gpgme-8c09dd9989bcd434a8cb5997770cb8414b96bd5c.tar.gz gpgme-8c09dd9989bcd434a8cb5997770cb8414b96bd5c.zip | |
core: New global flag "require-gnupg".
* src/gpgme.c (gpgme_set_global_flag): Add flag.
* src/engine.c (engine_minimal_version): New variable.
(_gpgme_set_engine_minimal_version): New function.
(gpgme_get_engine_info): Check that flag.
* tests/run-keylist.c (main): New option --require-gnupg.
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'src')
| -rw-r--r-- | src/engine.c | 35 | ||||
| -rw-r--r-- | src/engine.h | 2 | ||||
| -rw-r--r-- | src/gpgme.c | 2 | 
3 files changed, 39 insertions, 0 deletions
| diff --git a/src/engine.c b/src/engine.c index a7c016f0..f428034d 100644 --- a/src/engine.c +++ b/src/engine.c @@ -63,6 +63,10 @@ static struct engine_ops *engine_ops[] =  static gpgme_engine_info_t engine_info;  DEFINE_STATIC_LOCK (engine_info_lock); +/* If non-NULL, the minimal version required for all engines.  */ +static char *engine_minimal_version; + +  /* Get the file name of the engine for PROTOCOL.  */  static const char * @@ -178,6 +182,26 @@ _gpgme_engine_info_release (gpgme_engine_info_t info)  } +/* This is an internal function to set a mimimal required version. + * This function must only be called by gpgme_set_global_flag. + * Returns 0 on success.  */ +int +_gpgme_set_engine_minimal_version (const char *value) +{ +  free (engine_minimal_version); +  if (value) +    { +      engine_minimal_version = strdup (value); +      return !engine_minimal_version; +    } +  else +    { +      engine_minimal_version = NULL; +      return 0; +    } +} + +  /* Get the information about the configured and installed engines.  A     pointer to the first engine in the statically allocated linked list     is returned in *INFO.  If an error occurs, it is returned.  The @@ -229,6 +253,17 @@ gpgme_get_engine_info (gpgme_engine_info_t *info)            if (!*lastp && !err)              err = gpg_error_from_syserror (); +          /* Check against the optional minimal engine version.  */ +          if (!err && version && engine_minimal_version +              && !_gpgme_compare_versions (version, engine_minimal_version)) +            { +#if GPG_ERROR_VERSION_NUMBER < 0x011900 /* 1.25 */ +              err = gpg_error (GPG_ERR_NO_ENGINE); +#else +              err = gpg_error (GPG_ERR_ENGINE_TOO_OLD); +#endif +            } +            /* Now set the dummy version for pseudo engines.  */            if (!err && !version)              { diff --git a/src/engine.h b/src/engine.h index 238a21c0..b713d961 100644 --- a/src/engine.h +++ b/src/engine.h @@ -38,6 +38,8 @@ typedef gpgme_error_t (*engine_command_handler_t) (void *priv,  typedef gpgme_error_t (*engine_assuan_result_cb_t) (void *priv,                                                      gpgme_error_t result); +/* Helper for gpgme_set_global_flag.  */ +int _gpgme_set_engine_minimal_version (const char *value);  /* Get a deep copy of the engine info and return it in INFO.  */  gpgme_error_t _gpgme_engine_info_copy (gpgme_engine_info_t *r_info); diff --git a/src/gpgme.c b/src/gpgme.c index e0cd9b05..d59f8080 100644 --- a/src/gpgme.c +++ b/src/gpgme.c @@ -71,6 +71,8 @@ gpgme_set_global_flag (const char *name, const char *value)        _gpgme_dirinfo_disable_gpgconf ();        return 0;      } +  else if (!strcmp (name, "require-gnupg")) +    return _gpgme_set_engine_minimal_version (value);    else if (!strcmp (name, "gpgconf-name"))      return _gpgme_set_default_gpgconf_name (value);    else if (!strcmp (name, "gpg-name")) | 
