aboutsummaryrefslogtreecommitdiffstats
path: root/common/asshelp.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/asshelp.c')
-rw-r--r--common/asshelp.c45
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)