aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine-gpg.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2013-02-07 19:59:16 +0000
committerWerner Koch <[email protected]>2013-02-07 19:59:16 +0000
commit61a0d92b679f248505f1bf16386bc41a5bf2ba1d (patch)
tree7f3e0358bb4f6004a395a55a2902b27940dcf79e /src/engine-gpg.c
parentAdd public function gpgme_io_writen. (diff)
downloadgpgme-61a0d92b679f248505f1bf16386bc41a5bf2ba1d.tar.gz
gpgme-61a0d92b679f248505f1bf16386bc41a5bf2ba1d.zip
Add public function gpgme_set_pinentry_mode.
* src/gpgme.c (gpgme_set_pinentry_mode): New. * src/gpgme.h.in (gpgme_pinentry_t): New. (gpgme_set_pinentry_mode): New. * src/context.h (struct gpgme_context): Add field pinentry_mode. * src/engine-backend.h (struct engine_ops): Add field set_pinentry_mode. * src/engine-gpg.c (struct engine_gpg): Add field pinentry_mode. (build_argv): Implement pinentry_mode. (gpg_set_pinentry_mode): New. (_gpgme_engine_ops_gpg): Register gpg_set_pinentry_mode. -- Note that this new fucntion may only be used with gpg 2.1.
Diffstat (limited to '')
-rw-r--r--src/engine-gpg.c43
1 files changed, 42 insertions, 1 deletions
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index 825a4503..3f025030 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -134,6 +134,7 @@ struct engine_gpg
} cmd;
struct gpgme_io_cbs io_cbs;
+ gpgme_pinentry_mode_t pinentry_mode;
};
typedef struct engine_gpg *engine_gpg_t;
@@ -769,6 +770,8 @@ build_argv (engine_gpg_t gpg)
argc++;
if (use_agent)
argc++;
+ if (gpg->pinentry_mode)
+ argc++;
if (!gpg->cmd.used)
argc++; /* --batch */
argc += 1; /* --no-sk-comment */
@@ -818,6 +821,32 @@ build_argv (engine_gpg_t gpg)
}
argc++;
}
+
+ if (gpg->pinentry_mode)
+ {
+ const char *s = NULL;
+ switch (gpg->pinentry_mode)
+ {
+ case GPGME_PINENTRY_MODE_DEFAULT: break;
+ case GPGME_PINENTRY_MODE_ASK: s = "--pinentry-mode=ask"; break;
+ case GPGME_PINENTRY_MODE_CANCEL: s = "--pinentry-mode=cancel"; break;
+ case GPGME_PINENTRY_MODE_ERROR: s = "--pinentry-mode=error"; break;
+ case GPGME_PINENTRY_MODE_LOOPBACK:s = "--pinentry-mode=loopback"; break;
+ }
+ if (s)
+ {
+ argv[argc] = strdup (s);
+ if (!argv[argc])
+ {
+ int saved_err = gpg_error_from_syserror ();
+ free (fd_data_map);
+ free_argv (argv);
+ return saved_err;
+ }
+ argc++;
+ }
+ }
+
if (!gpg->cmd.used)
{
argv[argc] = strdup ("--batch");
@@ -2348,6 +2377,17 @@ gpg_set_io_cbs (void *engine, gpgme_io_cbs_t io_cbs)
gpg->io_cbs = *io_cbs;
}
+
+static gpgme_error_t
+gpg_set_pinentry_mode (void *engine, gpgme_pinentry_mode_t mode)
+{
+ engine_gpg_t gpg = engine;
+
+ gpg->pinentry_mode = mode;
+ return 0;
+}
+
+
struct engine_ops _gpgme_engine_ops_gpg =
{
@@ -2389,5 +2429,6 @@ struct engine_ops _gpgme_engine_ops_gpg =
gpg_io_event,
gpg_cancel,
NULL, /* cancel_op */
- gpg_passwd
+ gpg_passwd,
+ gpg_set_pinentry_mode
};