diff options
| author | Werner Koch <[email protected]> | 2013-02-07 19:59:16 +0000 | 
|---|---|---|
| committer | Werner Koch <[email protected]> | 2013-02-07 19:59:16 +0000 | 
| commit | 61a0d92b679f248505f1bf16386bc41a5bf2ba1d (patch) | |
| tree | 7f3e0358bb4f6004a395a55a2902b27940dcf79e /src/engine-gpg.c | |
| parent | Add public function gpgme_io_writen. (diff) | |
| download | gpgme-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 'src/engine-gpg.c')
| -rw-r--r-- | src/engine-gpg.c | 43 | 
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    }; | 
