aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine-gpg.c
diff options
context:
space:
mode:
authorBen Kibbey <[email protected]>2015-07-16 01:41:15 +0000
committerBen Kibbey <[email protected]>2015-07-17 01:10:48 +0000
commit259b61f73cb40fd3cb7da21cba4b1a69bfa2da78 (patch)
tree046ca71e0b6d5ab0834407875175ed587a23bdab /src/engine-gpg.c
parentPost release updates (diff)
downloadgpgme-bjk/custom-engine-options.tar.gz
gpgme-bjk/custom-engine-options.zip
Add per-ctx custom engine options.bjk/custom-engine-options
* src/gpgme.h.in (gpgme_ctx_set_engine_options): New prototype. (gpgme_ctx_get_engine_options): Ditto. * src/engine-backend.h (engine_ops): Add set_options and get_options. * src/engine.c (gpgme_ctx_set_engine_options): New. (gpgme_ctx_get_engine_options): Ditto. * src/engine-gpg.c (gpg_set_options): New. (gpg_get_options): Ditto. * src/op-support.c (_gpgme_op_reset): Keep custom options. * src/engine-gpg.c (_gpgme_engine_ops_gpg): Adjust for new members. * src/engine-assuan.c (_gpgme_engine_ops_assuan): Ditto. * src/engine-g13.c (_gpgme_engine_ops_g13): Ditto. * src/engine-gpgconf.c (_gpgme_engine_ops_gpgconf): Ditto. * src/engine-gpgsm.c (_gpgme_engine_ops_gpgsm): Ditto. * src/engine-spawn.c (_gpgme_engine_ops_spawn): Ditto. * src/engine-uiserver.c (_gpgme_engine_ops_uiserver): Ditto. * src/gpgme.def: Export new symbols. * src/libgpgme.vers: Ditto. * doc/gpgme.texi: Document these new functions. -- Not all of gpg2's features are exposed to libgpgme and adding these functions makes it possible to do things like specify an --s2k-count, etc.
Diffstat (limited to 'src/engine-gpg.c')
-rw-r--r--src/engine-gpg.c79
1 files changed, 78 insertions, 1 deletions
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index e14fd8dd..0be970a6 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -115,6 +115,7 @@ struct engine_gpg
char **argv;
struct fd_data_map_s *fd_data_map;
+ char *options; /* gpgme_ctx_set_engine_options() */
/* stuff needed for interactive (command) mode */
struct
@@ -404,6 +405,7 @@ gpg_release (void *engine)
free (gpg->status.buffer);
if (gpg->colon.buffer)
free (gpg->colon.buffer);
+ free (gpg->options);
if (gpg->argv)
free_argv (gpg->argv);
if (gpg->cmd.keyword)
@@ -716,6 +718,43 @@ gpg_set_command_handler (void *engine, engine_command_handler_t fnc,
}
+/* Custom command line options set with gpgme_ctx_set_engine_options() */
+static gpgme_error_t
+build_custom_argv (engine_gpg_t gpg, size_t *argc, char ***result)
+{
+ char *s, *options = gpg->options;
+ char **argv = NULL;
+ int total = 0;
+
+ if (!options)
+ return 0;
+
+ while ((s = strsep (&options, " ")))
+ {
+ char **tmp = realloc (argv, (total+2) * sizeof (char *));
+
+ if (!tmp)
+ {
+ free_argv (argv);
+ return GPG_ERR_ENOMEM;
+ }
+
+ argv = tmp;
+ argv[total] = strdup (s);
+ if (!argv[total++])
+ {
+ free_argv (argv);
+ return GPG_ERR_ENOMEM;
+ }
+
+ argv[total] = NULL;
+ (*argc)++;
+ }
+
+ *result = argv;
+ return 0;
+}
+
static gpgme_error_t
build_argv (engine_gpg_t gpg, const char *pgmname)
{
@@ -723,7 +762,7 @@ build_argv (engine_gpg_t gpg, const char *pgmname)
struct arg_and_data_s *a;
struct fd_data_map_s *fd_data_map;
size_t datac=0, argc=0;
- char **argv;
+ char **argv, **custom_argv = NULL, **pp;
int need_special = 0;
int use_agent = 0;
char *p;
@@ -780,6 +819,10 @@ build_argv (engine_gpg_t gpg, const char *pgmname)
argc++; /* --batch */
argc += 1; /* --no-sk-comments */
+ err = build_custom_argv (gpg, &argc, &custom_argv);
+ if (err)
+ return err;
+
argv = calloc (argc + 1, sizeof *argv);
if (!argv)
return gpg_error_from_syserror ();
@@ -801,6 +844,14 @@ build_argv (engine_gpg_t gpg, const char *pgmname)
return saved_err;
}
argc++;
+
+ if (custom_argv)
+ {
+ for (pp = custom_argv; pp && *pp; pp++)
+ argv[argc++] = *pp;
+ free (custom_argv);
+ }
+
if (need_special)
{
argv[argc] = strdup ("--enable-special-filenames");
@@ -2449,6 +2500,30 @@ gpg_set_pinentry_mode (void *engine, gpgme_pinentry_mode_t mode)
return 0;
}
+static gpgme_error_t
+gpg_set_options (void *engine, const char *options)
+{
+ engine_gpg_t gpg = engine;
+
+ free (gpg->options);
+ gpg->options = NULL;
+ if (options)
+ {
+ gpg->options = strdup (options);
+ if (!gpg->options)
+ return GPG_ERR_ENOMEM;
+ }
+
+ return 0;
+}
+
+static const char *
+gpg_get_options (void *engine)
+{
+ engine_gpg_t gpg = engine;
+
+ return gpg->options;
+}
struct engine_ops _gpgme_engine_ops_gpg =
@@ -2468,6 +2543,8 @@ struct engine_ops _gpgme_engine_ops_gpg =
gpg_set_colon_line_handler,
gpg_set_locale,
NULL, /* set_protocol */
+ gpg_set_options,
+ gpg_get_options,
gpg_decrypt,
gpg_decrypt, /* decrypt_verify */
gpg_delete,