From 995a02825947cf6f11b67998d850c748d320c8cd Mon Sep 17 00:00:00 2001 From: JinWang An Date: Wed, 1 Dec 2021 16:54:34 +0900 Subject: Imported Upstream version 1.5.0 --- src/engine-gpg.c | 49 +++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 18 deletions(-) (limited to 'src/engine-gpg.c') 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 */ }; -- cgit v1.2.3