aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine-gpg.c
diff options
context:
space:
mode:
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
};