summaryrefslogtreecommitdiff
path: root/src/engine-gpg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine-gpg.c')
-rw-r--r--src/engine-gpg.c49
1 files changed, 31 insertions, 18 deletions
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index 36f035a..ede098e 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -1,7 +1,7 @@
/* engine-gpg.c - Gpg Engine.
Copyright (C) 2000 Werner Koch (dd9jn)
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007,
- 2009, 2010, 2012 g10 Code GmbH
+ 2009, 2010, 2012, 2013 g10 Code GmbH
This file is part of GPGME.
@@ -303,7 +303,7 @@ gpg_get_version (const char *file_name)
static const char *
gpg_get_req_version (void)
{
- return NEED_GPG_VERSION;
+ return "1.4.0";
}
@@ -718,7 +718,7 @@ gpg_set_command_handler (void *engine, engine_command_handler_t fnc,
static gpgme_error_t
-build_argv (engine_gpg_t gpg)
+build_argv (engine_gpg_t gpg, const char *pgmname)
{
gpgme_error_t err;
struct arg_and_data_s *a;
@@ -729,15 +729,20 @@ build_argv (engine_gpg_t gpg)
int use_agent = 0;
char *p;
- /* We don't want to use the agent with a malformed environment
- variable. This is only a very basic test but sufficient to make
- our life in the regression tests easier. */
- err = _gpgme_getenv ("GPG_AGENT_INFO", &p);
- if (err)
- return err;
- use_agent = (p && strchr (p, ':'));
- if (p)
- free (p);
+ if (_gpgme_in_gpg_one_mode ())
+ {
+ /* In GnuPG-1 mode we don't want to use the agent with a
+ malformed environment variable. This is only a very basic
+ test but sufficient to make our life in the regression tests
+ easier. With GnuPG-2 the agent is anyway required and on
+ modern installations GPG_AGENT_INFO is optional. */
+ err = _gpgme_getenv ("GPG_AGENT_INFO", &p);
+ if (err)
+ return err;
+ use_agent = (p && strchr (p, ':'));
+ if (p)
+ free (p);
+ }
if (gpg->argv)
{
@@ -788,7 +793,7 @@ build_argv (engine_gpg_t gpg)
}
argc = datac = 0;
- argv[argc] = strdup ("gpg"); /* argv[0] */
+ argv[argc] = strdup (_gpgme_get_basename (pgmname)); /* argv[0] */
if (!argv[argc])
{
int saved_err = gpg_error_from_syserror ();
@@ -1296,6 +1301,7 @@ start (engine_gpg_t gpg)
int status;
struct spawn_fd_item_s *fd_list;
pid_t pid;
+ const char *pgmname;
if (!gpg)
return gpg_error (GPG_ERR_INV_VALUE);
@@ -1321,7 +1327,8 @@ start (engine_gpg_t gpg)
return rc;
}
- rc = build_argv (gpg);
+ pgmname = gpg->file_name ? gpg->file_name : _gpgme_get_default_gpg_name ();
+ rc = build_argv (gpg, pgmname);
if (rc)
return rc;
@@ -1355,9 +1362,8 @@ start (engine_gpg_t gpg)
fd_list[n].fd = -1;
fd_list[n].dup_to = -1;
- status = _gpgme_io_spawn (gpg->file_name ? gpg->file_name :
- _gpgme_get_default_gpg_name (), gpg->argv,
- IOSPAWN_FLAG_ALLOW_SET_FG,
+ status = _gpgme_io_spawn (pgmname, gpg->argv,
+ (IOSPAWN_FLAG_DETACHED |IOSPAWN_FLAG_ALLOW_SET_FG),
fd_list, NULL, NULL, &pid);
{
int saved_err = gpg_error_from_syserror ();
@@ -1656,6 +1662,9 @@ gpg_encrypt (void *engine, gpgme_key_t recp[], gpgme_encrypt_flags_t flags,
if (!err && use_armor)
err = add_arg (gpg, "--armor");
+ if (!err && (flags & GPGME_ENCRYPT_NO_COMPRESS))
+ err = add_arg (gpg, "--compress-algo=none");
+
if (!symmetric)
{
/* If we know that all recipients are valid (full or ultimate trust)
@@ -1713,6 +1722,9 @@ gpg_encrypt_sign (void *engine, gpgme_key_t recp[],
if (!err && use_armor)
err = add_arg (gpg, "--armor");
+ if (!err && (flags & GPGME_ENCRYPT_NO_COMPRESS))
+ err = add_arg (gpg, "--compress-algo=none");
+
if (!symmetric)
{
/* If we know that all recipients are valid (full or ultimate trust)
@@ -2443,5 +2455,6 @@ struct engine_ops _gpgme_engine_ops_gpg =
gpg_cancel,
NULL, /* cancel_op */
gpg_passwd,
- gpg_set_pinentry_mode
+ gpg_set_pinentry_mode,
+ NULL /* opspawn */
};