assuan: Reorganize waiting for socket.

* common/asshelp.c (wait_for_sock): New function, collecting
codepaths from...
(start_new_gpg_agent) here and...
(start_new_dirmngr) here.
--

This has no functional change, but makes it easier to make this
function more efficient.

GnuPG-bug-id: 3490
Signed-off-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
(cherry picked from commit 0471ff9d3b)
This commit is contained in:
Daniel Kahn Gillmor 2017-11-08 16:15:30 +01:00 committed by Werner Koch
parent 0709f358cd
commit a22a55b994
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
1 changed files with 30 additions and 42 deletions

View File

@ -307,6 +307,32 @@ unlock_spawning (lock_spawn_t *lock, const char *name)
} }
} }
static gpg_error_t
wait_for_sock (int secs, const char *name, const char *sockname, int verbose, assuan_context_t ctx, int *did_success_msg)
{
int i;
gpg_error_t err = 0;
for (i=0; i < secs; i++)
{
if (verbose)
log_info (_("waiting for the %s to come up ... (%ds)\n"),
name, secs - i);
gnupg_sleep (1);
err = assuan_socket_connect (ctx, sockname, 0, 0);
if (!err)
{
if (verbose)
{
log_info (_("connection to %s established\n"),
name);
*did_success_msg = 1;
}
break;
}
}
return err;
}
/* Try to connect to the agent via socket or start it if it is not /* Try to connect to the agent via socket or start it if it is not
running and AUTOSTART is set. Handle the server's initial running and AUTOSTART is set. Handle the server's initial
greeting. Returns a new assuan context at R_CTX or an error greeting. Returns a new assuan context at R_CTX or an error
@ -433,25 +459,8 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
log_error ("failed to start agent '%s': %s\n", log_error ("failed to start agent '%s': %s\n",
agent_program, gpg_strerror (err)); agent_program, gpg_strerror (err));
else else
{ err = wait_for_sock (SECS_TO_WAIT_FOR_AGENT, "agent",
for (i=0; i < SECS_TO_WAIT_FOR_AGENT; i++) sockname, verbose, ctx, &did_success_msg);
{
if (verbose)
log_info (_("waiting for the agent to come up ... (%ds)\n"),
SECS_TO_WAIT_FOR_AGENT - i);
gnupg_sleep (1);
err = assuan_socket_connect (ctx, sockname, 0, 0);
if (!err)
{
if (verbose)
{
log_info (_("connection to agent established\n"));
did_success_msg = 1;
}
break;
}
}
}
} }
unlock_spawning (&lock, "agent"); unlock_spawning (&lock, "agent");
@ -584,29 +593,8 @@ start_new_dirmngr (assuan_context_t *r_ctx,
log_error ("failed to start the dirmngr '%s': %s\n", log_error ("failed to start the dirmngr '%s': %s\n",
dirmngr_program, gpg_strerror (err)); dirmngr_program, gpg_strerror (err));
else else
{ err = wait_for_sock (SECS_TO_WAIT_FOR_DIRMNGR, "dirmngr",
int i; sockname, verbose, ctx, &did_success_msg);
for (i=0; i < SECS_TO_WAIT_FOR_DIRMNGR; i++)
{
if (verbose)
log_info (_("waiting for the dirmngr "
"to come up ... (%ds)\n"),
SECS_TO_WAIT_FOR_DIRMNGR - i);
gnupg_sleep (1);
err = assuan_socket_connect (ctx, sockname, 0, 0);
if (!err)
{
if (verbose)
{
log_info (_("connection to the dirmngr"
" established\n"));
did_success_msg = 1;
}
break;
}
}
}
} }
unlock_spawning (&lock, "dirmngr"); unlock_spawning (&lock, "dirmngr");