const char *msg);
+#define DLOG(m, ...) do{ \
+ int DLOG_se = errno; \
+ if (/*DBG_IPC*/ 0) \
+ log_debug("asshelp " m, \
+ ##__VA_ARGS__); \
+ errno = DLOG_se; \
+ }while(0)
+
+
static int
my_libassuan_log_handler (assuan_context_t ctx, void *hook,
unsigned int cat, const char *msg)
char *fname;
(void)verbose;
+ DLOG("lock_spawning(,%s,%s)\n", homedir, name);
+
*lock = NULL;
fname = make_absfilename_try
static void
unlock_spawning (lock_spawn_t *lock, const char *name)
{
+ DLOG("unlock_spawning(%p, %s)\n", lock, name);
+
if (*lock)
{
(void)name;
*r_ctx = NULL;
+ DLOG("start_new_gpg_agent(autostart=%d)...\n",autostart);
+
err = assuan_new (&ctx);
if (err)
{
return err;
}
+ DLOG("start_new_gpg_agent sockname=%s...\n",sockname);
+
err = assuan_socket_connect (ctx, sockname, 0, 0);
if (err && autostart)
{
const char *s;
int i;
+ DLOG("start_new_gpg_agent err=%d, spawning...\n",err);
+
/* With no success start a new server. */
if (!agent_program || !*agent_program)
agent_program = gnupg_module_name (GNUPG_MODULE_NAME_AGENT);
gpg_err_code_from_syserror ());
xfree (sockname);
assuan_release (ctx);
+ DLOG("start_new_gpg_agent ERROR %ld (xstrdup)\n", (long)tmperr);
return tmperr;
}
p = strchr (program, '|');
xfree (sockname);
assuan_release (ctx);
xfree (program);
+ DLOG("start_new_gpg_agent ERROR %ld (abs_homedir)\n", (long)tmperr);
return tmperr;
}
assuan_release (ctx);
xfree (abs_homedir);
xfree (program);
+ DLOG("start_new_gpg_agent ERROR %ld (fflush)\n", (long)tmperr);
return tmperr;
}
argv[i++] = "--daemon";
argv[i++] = NULL;
+ DLOG("start_new_gpg_agent locking spawning...\n");
if (!(err = lock_spawning (&lock, gnupg_homedir (), "agent", verbose))
&& assuan_socket_connect (ctx, sockname, 0, 0))
{
+ DLOG("start_new_gpg_agent locked spawning, no connect...\n");
err = gnupg_spawn_process_detached (program? program : agent_program,
argv, NULL);
if (err)
{
for (i=0; i < SECS_TO_WAIT_FOR_AGENT; i++)
{
+ DLOG("start_new_gpg_agent waiting %d...\n", i);
if (verbose)
log_info (_("waiting for the agent to come up ... (%ds)\n"),
SECS_TO_WAIT_FOR_AGENT - i);
}
}
}
+ DLOG("start_new_gpg_agent lock failed or connect failed...\n");
unlock_spawning (&lock, "agent");
xfree (abs_homedir);
xfree (sockname);
if (err)
{
+ DLOG("start_new_gpg_agent ERROR (connect)\n");
+
if (autostart || gpg_err_code (err) != GPG_ERR_ASS_CONNECT_FAILED)
log_error ("can't connect to the agent: %s\n", gpg_strerror (err));
assuan_release (ctx);
if (err)
{
assuan_release (ctx);
+ DLOG("start_new_gpg_agent ERROR %ld (final)\n", (long)err);
return err;
}
*r_ctx = ctx;
+ DLOG("start_new_gpg_agent=%p OK\n", ctx);
return 0;
}