diff options
Diffstat (limited to 'common/asshelp.c')
-rw-r--r-- | common/asshelp.c | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/common/asshelp.c b/common/asshelp.c index e97d39603..3fc28a156 100644 --- a/common/asshelp.c +++ b/common/asshelp.c @@ -363,7 +363,7 @@ start_new_gpg_agent (assuan_context_t *r_ctx, assuan_context_t ctx; int did_success_msg = 0; char *sockname; - const char *argv[5]; + const char *argv[6]; *r_ctx = NULL; @@ -380,10 +380,31 @@ start_new_gpg_agent (assuan_context_t *r_ctx, { char *abs_homedir; lock_spawn_t lock; + char *program = NULL; + const char *program_arg = NULL; + char *p; + const char *s; + int i; /* With no success start a new server. */ if (!agent_program || !*agent_program) agent_program = gnupg_module_name (GNUPG_MODULE_NAME_AGENT); + else if ((s=strchr (agent_program, '|')) && s[1] == '-' && s[2]=='-') + { + /* Hack to insert an additional option on the command line. */ + program = xtrystrdup (agent_program); + if (!program) + { + gpg_error_t tmperr = gpg_err_make (errsource, + gpg_err_code_from_syserror ()); + xfree (sockname); + assuan_release (ctx); + return tmperr; + } + p = strchr (program, '|'); + *p++ = 0; + program_arg = p; + } if (verbose) log_info (_("no running gpg-agent - starting '%s'\n"), @@ -404,6 +425,7 @@ start_new_gpg_agent (assuan_context_t *r_ctx, log_error ("error building filename: %s\n",gpg_strerror (tmperr)); xfree (sockname); assuan_release (ctx); + xfree (program); return tmperr; } @@ -416,30 +438,32 @@ start_new_gpg_agent (assuan_context_t *r_ctx, xfree (sockname); assuan_release (ctx); xfree (abs_homedir); + xfree (program); return tmperr; } /* If the agent has been configured for use with a standard socket, an environment variable is not required and thus we we can savely start the agent here. */ - - argv[0] = "--homedir"; - argv[1] = abs_homedir; - argv[2] = "--use-standard-socket"; - argv[3] = "--daemon"; - argv[4] = NULL; + i = 0; + argv[i++] = "--homedir"; + argv[i++] = abs_homedir; + argv[i++] = "--use-standard-socket"; + if (program_arg) + argv[i++] = program_arg; + argv[i++] = "--daemon"; + argv[i++] = NULL; if (!(err = lock_spawning (&lock, homedir, "agent", verbose)) && assuan_socket_connect (ctx, sockname, 0, 0)) { - err = gnupg_spawn_process_detached (agent_program, argv,NULL); + err = gnupg_spawn_process_detached (program? program : agent_program, + argv, NULL); if (err) log_error ("failed to start agent '%s': %s\n", agent_program, gpg_strerror (err)); else { - int i; - for (i=0; i < SECS_TO_WAIT_FOR_AGENT; i++) { if (verbose) @@ -462,6 +486,7 @@ start_new_gpg_agent (assuan_context_t *r_ctx, unlock_spawning (&lock, "agent"); xfree (abs_homedir); + xfree (program); } xfree (sockname); if (err) |