diff options
author | Werner Koch <[email protected]> | 2014-02-21 10:22:45 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2014-02-21 10:22:45 +0000 |
commit | 651d9e1c6bc1cab248024c3850ef64698247588f (patch) | |
tree | 1ef03ae1f09046eae7ae5c31daa48b7394c157b1 /src/engine-gpg.c | |
parent | Fix type inconsistency between gpgme.h and gpgme.c. (diff) | |
download | gpgme-651d9e1c6bc1cab248024c3850ef64698247588f.tar.gz gpgme-651d9e1c6bc1cab248024c3850ef64698247588f.zip |
Always pass correct name to argv[0]. Ignore GPG_AGENT_INFO for gpg2.
* src/dirinfo.c (WANT_GPG_ONE_MODE): New.
(struct dirinfo): Add field "gpg_one_mode".
(get_gpgconf_item): Set that field and return it if requested.
(_gpgme_in_gpg_one_mode): New.
* src/engine-gpg.c (build_argv): Check GPG_AGENT_INFO only in gpg-1
mode.
* src/dirinfo.c (_gpgme_get_basename): New.
* src/engine-g13.c (g13_new): Take argv[0] from the pgmname.
* src/engine-gpgsm.c (gpgsm_new): Ditto.
* src/engine-gpg.c (build_argv): Ditto. Add arg PGMNAME.
(start): Pass PGMNAME to buildargv.
Diffstat (limited to '')
-rw-r--r-- | src/engine-gpg.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/src/engine-gpg.c b/src/engine-gpg.c index 2f59bb9a..6b04e184 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -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 (); @@ -1292,6 +1297,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); @@ -1317,7 +1323,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; @@ -1351,8 +1358,7 @@ 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, + status = _gpgme_io_spawn (pgmname, gpg->argv, IOSPAWN_FLAG_ALLOW_SET_FG, fd_list, NULL, NULL, &pid); { |