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 'src/engine-gpg.c')
| -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);    { | 
