[Pkg-gnupg-commit] [gpgme] 61/103: gpgconf: Add access to --list-dirs for non-default engine.
Daniel Kahn Gillmor
dkg at fifthhorseman.net
Thu Dec 14 18:53:04 UTC 2017
This is an automated email from the git hooks/post-receive script.
dkg pushed a commit to branch master
in repository gpgme.
commit 9f24e6c9010e171fd11c5cdac797cb8ce2e501dd
Author: Marcus Brinkmann <marcus.brinkmann at ruhr-uni-bochum.de>
Date: Tue Aug 15 19:40:12 2017 +0200
gpgconf: Add access to --list-dirs for non-default engine.
* src/engine-assuan.c (_gpgme_engine_ops_assuan): Add conf_dir.
* src/engine-g13.c (_gpgme_engine_ops_g13): Likewise.
* src/engine-gpg.c (_gpgme_engine_ops_gpg): Likewise.
* src/engine-gpgsm.c (_gpgme_engine_ops_gpgsm): Likewise.
* src/engine-spawn.c (_gpgme_engine_ops_spawn): Likewise.
* src/engine-uiserver.c (_gpgme_engine_ops_uiserver): Likewise.
* src/engine-backend.h (struct engine_ops): Likewise.
* src/engine-gpgconf.c (gpgconf_config_dir_cb, gpgconf_conf_dir):
New functions.
(struct engine_ops): Add gpgconf_conf_dir.
* src/engine.c (_gpgme_engine_op_conf_dir): New function.
* src/engine.h (_gpgme_engine_op_conf_dir): New prototype.
* src/gpgconf.c (gpgme_op_conf_dir): New function.
* src/gpgme.def (gpgme_op_conf_save): New symbol.
* src/gpgme.h.in (gpgme_op_conf_dir): New prototype.
* src/libgpgme.vers (gpgme_op_conf_dir): New symbol.
* tests/gpg/t-gpgconf.c (main): Test gpgme_op_conf_dir.
Signed-off-by: Marcus Brinkmann <mb at g10code.com>
GnuPG-bug-id: 3018
---
src/engine-assuan.c | 1 +
src/engine-backend.h | 1 +
src/engine-g13.c | 1 +
src/engine-gpg.c | 1 +
src/engine-gpgconf.c | 43 +++++++++++++++++++++++++++++++++++++++++++
src/engine-gpgsm.c | 1 +
src/engine-spawn.c | 1 +
src/engine-uiserver.c | 1 +
src/engine.c | 13 +++++++++++++
src/engine.h | 3 +++
src/gpgconf.c | 21 +++++++++++++++++++++
src/gpgme.def | 2 ++
src/gpgme.h.in | 4 ++++
src/libgpgme.vers | 1 +
tests/gpg/t-gpgconf.c | 17 +++++++++++++++++
15 files changed, 111 insertions(+)
diff --git a/src/engine-assuan.c b/src/engine-assuan.c
index 68bdaa6..bb2290a 100644
--- a/src/engine-assuan.c
+++ b/src/engine-assuan.c
@@ -796,6 +796,7 @@ struct engine_ops _gpgme_engine_ops_assuan =
llass_transact, /* opassuan_transact */
NULL, /* conf_load */
NULL, /* conf_save */
+ NULL, /* conf_dir */
NULL, /* query_swdb */
llass_set_io_cbs,
llass_io_event,
diff --git a/src/engine-backend.h b/src/engine-backend.h
index 90328ec..f41aaeb 100644
--- a/src/engine-backend.h
+++ b/src/engine-backend.h
@@ -128,6 +128,7 @@ struct engine_ops
gpgme_error_t (*conf_load) (void *engine, gpgme_conf_comp_t *conf_p);
gpgme_error_t (*conf_save) (void *engine, gpgme_conf_comp_t conf);
+ gpgme_error_t (*conf_dir) (void *engine, const char *what, char **result);
gpgme_error_t (*query_swdb) (void *engine,
const char *name, const char *iversion,
diff --git a/src/engine-g13.c b/src/engine-g13.c
index 02951e8..f8f3178 100644
--- a/src/engine-g13.c
+++ b/src/engine-g13.c
@@ -811,6 +811,7 @@ struct engine_ops _gpgme_engine_ops_g13 =
g13_transact,
NULL, /* conf_load */
NULL, /* conf_save */
+ NULL, /* conf_dir */
NULL, /* query_swdb */
g13_set_io_cbs,
g13_io_event,
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index c749c97..bc60d82 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -3093,6 +3093,7 @@ struct engine_ops _gpgme_engine_ops_gpg =
NULL, /* opassuan_transact */
NULL, /* conf_load */
NULL, /* conf_save */
+ NULL, /* conf_dir */
NULL, /* query_swdb */
gpg_set_io_cbs,
gpg_io_event,
diff --git a/src/engine-gpgconf.c b/src/engine-gpgconf.c
index af5f110..2b0f448 100644
--- a/src/engine-gpgconf.c
+++ b/src/engine-gpgconf.c
@@ -986,6 +986,48 @@ gpgconf_conf_save (void *engine, gpgme_conf_comp_t comp)
}
+static gpgme_error_t
+gpgconf_config_dir_cb (void *hook, char *line)
+{
+ /* This is an input- and output-parameter. */
+ char **str_p = (char **) hook;
+ char *what = *str_p;
+ int len = strlen(what);
+
+ if (!strncmp(line, what, len) && line[len] == ':')
+ {
+ char *result = strdup(&line[len + 1]);
+ if (!result)
+ return gpg_error_from_syserror ();
+ *str_p = result;
+ return gpg_error(GPG_ERR_USER_1);
+ }
+ return 0;
+}
+
+
+static gpgme_error_t
+gpgconf_conf_dir (void *engine, const char *what, char **result)
+{
+ gpgme_error_t err;
+ char *res = what;
+
+ *result = NULL;
+ err = gpgconf_read (engine, "--list-dirs", NULL,
+ gpgconf_config_dir_cb, &res);
+ if (gpg_err_code (err) == GPG_ERR_USER_1)
+ {
+ /* This signals to use that a result was found. */
+ *result = res;
+ return 0;
+ }
+
+ if (!err)
+ err = gpg_error(GPG_ERR_NOT_FOUND);
+ return 0;
+}
+
+
/* Parse a line received from gpgconf --query-swdb. This function may
* modify LINE. The result is stored at RESUL. */
static gpg_error_t
@@ -1254,6 +1296,7 @@ struct engine_ops _gpgme_engine_ops_gpgconf =
NULL, /* opassuan_transact */
gpgconf_conf_load,
gpgconf_conf_save,
+ gpgconf_conf_dir,
gpgconf_query_swdb,
gpgconf_set_io_cbs,
NULL, /* io_event */
diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c
index a0fcb1f..f23b0bf 100644
--- a/src/engine-gpgsm.c
+++ b/src/engine-gpgsm.c
@@ -2119,6 +2119,7 @@ struct engine_ops _gpgme_engine_ops_gpgsm =
NULL, /* opassuan_transact */
NULL, /* conf_load */
NULL, /* conf_save */
+ NULL, /* conf_dir */
NULL, /* query_swdb */
gpgsm_set_io_cbs,
gpgsm_io_event,
diff --git a/src/engine-spawn.c b/src/engine-spawn.c
index 9d587cc..7044781 100644
--- a/src/engine-spawn.c
+++ b/src/engine-spawn.c
@@ -469,6 +469,7 @@ struct engine_ops _gpgme_engine_ops_spawn =
NULL, /* opassuan_transact */
NULL, /* conf_load */
NULL, /* conf_save */
+ NULL, /* conf_dir */
NULL, /* query_swdb */
engspawn_set_io_cbs,
engspawn_io_event, /* io_event */
diff --git a/src/engine-uiserver.c b/src/engine-uiserver.c
index 20a8abf..3db705d 100644
--- a/src/engine-uiserver.c
+++ b/src/engine-uiserver.c
@@ -1386,6 +1386,7 @@ struct engine_ops _gpgme_engine_ops_uiserver =
NULL, /* opassuan_transact */
NULL, /* conf_load */
NULL, /* conf_save */
+ NULL, /* conf_dir */
NULL, /* query_swdb */
uiserver_set_io_cbs,
uiserver_io_event,
diff --git a/src/engine.c b/src/engine.c
index 89a8552..2c7e625 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -984,6 +984,19 @@ _gpgme_engine_op_conf_save (engine_t engine, gpgme_conf_comp_t conf)
gpgme_error_t
+_gpgme_engine_op_conf_dir (engine_t engine, const char *what, char **result)
+{
+ if (!engine)
+ return gpg_error (GPG_ERR_INV_VALUE);
+
+ if (!engine->ops->conf_dir)
+ return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+
+ return (*engine->ops->conf_dir) (engine->engine, what, result);
+}
+
+
+gpgme_error_t
_gpgme_engine_op_query_swdb (engine_t engine,
const char *name, const char *iversion,
gpgme_query_swdb_result_t result)
diff --git a/src/engine.h b/src/engine.h
index d25c1fa..b71b7e2 100644
--- a/src/engine.h
+++ b/src/engine.h
@@ -176,6 +176,9 @@ gpgme_error_t _gpgme_engine_op_conf_load (engine_t engine,
gpgme_conf_comp_t *conf_p);
gpgme_error_t _gpgme_engine_op_conf_save (engine_t engine,
gpgme_conf_comp_t conf);
+gpgme_error_t _gpgme_engine_op_conf_dir (engine_t engine,
+ const char *what,
+ char **result);
gpgme_error_t _gpgme_engine_op_query_swdb (engine_t engine,
const char *name,
diff --git a/src/gpgconf.c b/src/gpgconf.c
index b1b84a6..ce6ace4 100644
--- a/src/gpgconf.c
+++ b/src/gpgconf.c
@@ -108,3 +108,24 @@ gpgme_op_conf_save (gpgme_ctx_t ctx, gpgme_conf_comp_t comp)
ctx->protocol = proto;
return err;
}
+
+
+gpgme_error_t
+gpgme_op_conf_dir (gpgme_ctx_t ctx, const char *what, char **result)
+{
+ gpgme_error_t err;
+ gpgme_protocol_t proto;
+
+ if (!ctx)
+ return gpg_error (GPG_ERR_INV_VALUE);
+
+ proto = ctx->protocol;
+ ctx->protocol = GPGME_PROTOCOL_GPGCONF;
+ err = _gpgme_op_reset (ctx, 1);
+ if (err)
+ return err;
+
+ err = _gpgme_engine_op_conf_dir (ctx->engine, what, result);
+ ctx->protocol = proto;
+ return err;
+}
diff --git a/src/gpgme.def b/src/gpgme.def
index a891812..dd8e532 100644
--- a/src/gpgme.def
+++ b/src/gpgme.def
@@ -265,5 +265,7 @@ EXPORTS
gpgme_op_delete_ext @197
gpgme_op_delete_ext_start @198
+ gpgme_op_conf_save @199
+
; END
diff --git a/src/gpgme.h.in b/src/gpgme.h.in
index 29cda2c..8afc276 100644
--- a/src/gpgme.h.in
+++ b/src/gpgme.h.in
@@ -2240,6 +2240,10 @@ gpgme_error_t gpgme_op_conf_load (gpgme_ctx_t ctx, gpgme_conf_comp_t *conf_p);
follow chained components! */
gpgme_error_t gpgme_op_conf_save (gpgme_ctx_t ctx, gpgme_conf_comp_t comp);
+/* Retrieve the configured directory. */
+gpgme_error_t gpgme_op_conf_dir(gpgme_ctx_t ctx, const char *what,
+ char **result);
+
/* Information about software versions.
* This structure shall be considered read-only and an application
diff --git a/src/libgpgme.vers b/src/libgpgme.vers
index 9a74b76..a95befb 100644
--- a/src/libgpgme.vers
+++ b/src/libgpgme.vers
@@ -46,6 +46,7 @@ GPGME_1.1 {
gpgme_conf_opt_change;
gpgme_op_conf_load;
gpgme_op_conf_save;
+ gpgme_op_conf_dir;
gpgme_cancel_async;
diff --git a/tests/gpg/t-gpgconf.c b/tests/gpg/t-gpgconf.c
index 67bb886..8c81de6 100644
--- a/tests/gpg/t-gpgconf.c
+++ b/tests/gpg/t-gpgconf.c
@@ -263,6 +263,23 @@ main (void)
err = gpgme_new (&ctx);
fail_if_err (err);
+ /* Let's check getting the agent-socket directory for different homedirs. */
+ char *result1 = NULL;
+ err = gpgme_ctx_set_engine_info (ctx, GPGME_PROTOCOL_GPGCONF, NULL, "/tmp/foo");
+ fail_if_err (err);
+ err = gpgme_op_conf_dir (ctx, "agent-socket", &result1);
+ fail_if_err (err);
+
+ char *result2 = NULL;
+ err = gpgme_ctx_set_engine_info (ctx, GPGME_PROTOCOL_GPGCONF, NULL, NULL);
+ fail_if_err (err);
+ err = gpgme_op_conf_dir (ctx, "agent-socket", &result2);
+ fail_if_err (err);
+
+ /* They have to be different. */
+ test (strcmp(result1, result2));
+
+
err = gpgme_op_conf_load (ctx, &conf);
fail_if_err (err);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/gpgme.git
More information about the Pkg-gnupg-commit
mailing list