aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2016-08-16 16:53:42 +0000
committerWerner Koch <[email protected]>2016-08-16 16:53:42 +0000
commit8c09dd9989bcd434a8cb5997770cb8414b96bd5c (patch)
tree165b40484f5182676f32356b2f6b26c81723a2ca /src
parentcore: Simplify setting of dummy versions. (diff)
downloadgpgme-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.c35
-rw-r--r--src/engine.h2
-rw-r--r--src/gpgme.c2
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"))