mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-03 12:11:33 +01:00
Some tweaks to the agent startup.
This commit is contained in:
parent
54591341a4
commit
fd19a84c80
@ -850,6 +850,29 @@ main (int argc, char **argv )
|
||||
/*log_info ("NOTE: this is a development version!\n");*/
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_NLS
|
||||
/* gpg-agent usually does not output any messages because it runs in
|
||||
the background. For log files it is acceptable to have messages
|
||||
always encoded in utf-8. We switch here to utf-8, so that
|
||||
commands like --help still give native messages. It is far
|
||||
easier to switch only once instead of for every message and it
|
||||
actually helps when more then one thread is active (avoids an
|
||||
extra copy step). */
|
||||
bind_textdomain_codeset (PACKAGE_GT, "UTF-8");
|
||||
#endif
|
||||
|
||||
if (!pipe_server && !is_daemon && !gpgconf_list)
|
||||
{
|
||||
/* We have been called without any options and thus we merely
|
||||
check whether an agent is already running. We do this right
|
||||
here so that we don't clobber a logfile with this check but
|
||||
print the status directly to stderr. */
|
||||
opt.debug = 0;
|
||||
set_debug ();
|
||||
check_for_running_agent (0, 0);
|
||||
agent_exit (0);
|
||||
}
|
||||
|
||||
set_debug ();
|
||||
|
||||
if (atexit (cleanup))
|
||||
@ -939,27 +962,6 @@ main (int argc, char **argv )
|
||||
agent_exit (0);
|
||||
}
|
||||
|
||||
/* If this has been called without any options, we merely check
|
||||
whether an agent is already running. We do this here so that we
|
||||
don't clobber a logfile but print it directly to stderr. */
|
||||
if (!pipe_server && !is_daemon)
|
||||
{
|
||||
log_set_prefix (NULL, JNLIB_LOG_WITH_PREFIX);
|
||||
check_for_running_agent (0, 0);
|
||||
agent_exit (0);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_NLS
|
||||
/* gpg-agent usually does not output any messages because it runs in
|
||||
the background. For log files it is acceptable to have messages
|
||||
always encoded in utf-8. We switch here to utf-8, so that
|
||||
commands like --help still give native messages. It is far
|
||||
easier to switch only once instead of for every message and it
|
||||
actually helps when more then one thread is active (avoids an
|
||||
extra copy step). */
|
||||
bind_textdomain_codeset (PACKAGE_GT, "UTF-8");
|
||||
#endif
|
||||
|
||||
/* Now start with logging to a file if this is desired. */
|
||||
if (logfile)
|
||||
{
|
||||
|
@ -1,3 +1,9 @@
|
||||
2010-10-14 Werner Koch <wk@g10code.com>
|
||||
|
||||
* asshelp.c (start_new_gpg_agent): Print a notice once the agent
|
||||
has been started.
|
||||
(start_new_dirmngr): Likewise.
|
||||
|
||||
2010-10-13 Werner Koch <wk@g10code.com>
|
||||
|
||||
* miscellaneous.c (parse_version_number, parse_version_string)
|
||||
|
@ -422,17 +422,22 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
|
||||
int i;
|
||||
|
||||
if (verbose)
|
||||
log_info (_("waiting %d seconds for the %s "
|
||||
"to come up\n"), 5, "agent" );
|
||||
log_info (_("waiting %d seconds for the agent "
|
||||
"to come up\n"), 5);
|
||||
for (i=0; i < 5; i++)
|
||||
{
|
||||
gnupg_sleep (1);
|
||||
err = assuan_socket_connect (ctx, sockname, 0, 0);
|
||||
if (!err)
|
||||
{
|
||||
if (verbose && !debug)
|
||||
log_info (_("connection to agent"
|
||||
" established\n"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unlock_agent_spawning (&lock);
|
||||
}
|
||||
@ -513,7 +518,7 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
|
||||
}
|
||||
|
||||
if (debug)
|
||||
log_debug ("connection to agent established\n");
|
||||
log_debug (_("connection to agent established\n"));
|
||||
|
||||
err = assuan_transact (ctx, "RESET",
|
||||
NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
@ -606,17 +611,22 @@ start_new_dirmngr (assuan_context_t *r_ctx,
|
||||
int i;
|
||||
|
||||
if (verbose)
|
||||
log_info (_("waiting %d seconds for the %s to come up\n"),
|
||||
5, "dirmngr" );
|
||||
log_info (_("waiting %d seconds for the dirmngr to come up\n"),
|
||||
5);
|
||||
for (i=0; i < 5; i++)
|
||||
{
|
||||
gnupg_sleep (1);
|
||||
err = assuan_socket_connect (ctx, sockname, 0, 0);
|
||||
if (!err)
|
||||
{
|
||||
if (verbose && !debug)
|
||||
log_info (_("connection to the dirmngr"
|
||||
" established\n"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unlock_spawning (&lock, "dirmngr");
|
||||
}
|
||||
@ -637,7 +647,7 @@ start_new_dirmngr (assuan_context_t *r_ctx,
|
||||
}
|
||||
|
||||
if (debug)
|
||||
log_debug ("connection to the dirmngr established\n");
|
||||
log_debug (_("connection to the dirmngr established\n"));
|
||||
|
||||
*r_ctx = ctx;
|
||||
return 0;
|
||||
|
@ -46,7 +46,7 @@ EXTRA_DIST = runtest inittests $(testscripts) \
|
||||
samplekeys/cert_g10code_test1.pem \
|
||||
samplekeys/cert_g10code_theo1.pem
|
||||
|
||||
# We used to run $(testscripts) here but tehse asschk scripts ares not
|
||||
# We used to run $(testscripts) here but these asschk scripts ares not
|
||||
# completely reliable in all enviromnets and thus we better disable
|
||||
# them. The tests are anyway way to minimal. We will eventually
|
||||
# write new tests based on gpg-connect-agent which has a full fledged
|
||||
|
@ -16,15 +16,14 @@
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
# Process this file with automake to create Makefile.in
|
||||
|
||||
GPG_IMPORT = ../../g10/gpg2 --homedir . \
|
||||
GPG_IMPORT = ../../g10/gpg2 --homedir $(abs_builddir) \
|
||||
--quiet --yes --no-permission-warning --import
|
||||
|
||||
# Programs required before we can run these tests.
|
||||
required_pgms = ../../g10/gpg2 ../../agent/gpg-agent \
|
||||
../../tools/gpg-connect-agent
|
||||
|
||||
TESTS_ENVIRONMENT = GNUPGHOME=$(abs_builddir) GPG_AGENT_INFO= LC_ALL=C \
|
||||
../../agent/gpg-agent --quiet --daemon sh
|
||||
TESTS_ENVIRONMENT = GNUPGHOME=$(abs_builddir) GPG_AGENT_INFO= LC_ALL=C
|
||||
|
||||
TESTS = version.test mds.test \
|
||||
decrypt.test decrypt-dsa.test \
|
||||
@ -68,7 +67,6 @@ distclean-local:
|
||||
prepared.stamp: ./pubring.gpg ./secring.gpg ./plain-1 ./plain-2 ./plain-3 \
|
||||
./pubring.pkr ./secring.skr ./gpg_dearmor $(DATA_FILES)
|
||||
$(GPG_IMPORT) $(srcdir)/pubdemo.asc
|
||||
cat $(srcdir)/gpg-agent.conf.tmpl > gpg-agent.conf
|
||||
echo timestamp >./prepared.stamp
|
||||
|
||||
# We need to depend on a couple of programs so that the tests don't
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Definitions for the OpenPGP test scripts -*- sh -*-
|
||||
# Copyright 1998,1999,2000,2001,2002,2003,2004,2005,2006,
|
||||
# 2007 Free Software Foundation, Inc.
|
||||
# 2007, 2010 Free Software Foundation, Inc.
|
||||
# This file is free software; as a special exception the author gives
|
||||
# unlimited permission to copy and/or distribute it, with or without
|
||||
# modifications, as long as this notice is preserved. This file is
|
||||
@ -161,8 +161,19 @@ pgmname=`basename $0`
|
||||
|
||||
[ -z "$srcdir" ] && fatal "not called from make"
|
||||
|
||||
# Always work in the current directory. We set GNUPGHOME only if it
|
||||
# has not been set already. Usually it is set through the Makefile's
|
||||
# TESTS_ENVIRONMENT macro.
|
||||
if [ -z "$GNUPGHOME" ]; then
|
||||
GNUPGHOME=`/bin/pwd`
|
||||
export GNUPGHOME
|
||||
elif [ "$GNUPGHOME" != `/bin/pwd` ]; then
|
||||
echo "$pgmname: GNUPGHOME not set to the cwd" $* >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Make sure we have a valid option files even with VPATH builds.
|
||||
for f in gpg.conf ; do
|
||||
for f in gpg.conf gpg-agent.conf ; do
|
||||
if [ -f ./$f ]; then
|
||||
:
|
||||
elif [ -f $srcdir/$f.tmpl ]; then
|
||||
@ -170,17 +181,7 @@ for f in gpg.conf ; do
|
||||
fi
|
||||
done
|
||||
|
||||
# Always work in the current directory. We set GNUPGHOME only if it
|
||||
# has not been set already. Usually it is set through the Makefile's
|
||||
# TESTS_ENVIRONMENT macro.
|
||||
if [ -z "$GNUPGHOME" ]; then
|
||||
GNUPGHOME=`pwd`
|
||||
export GNUPGHOME
|
||||
elif [ "$GNUPGHOME" != `pwd` ]; then
|
||||
echo "$pgmname: GNUPGHOME not set to the cwd" $* >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# (--no-permission-warning makes only sense on the commandline)
|
||||
GPG="../../g10/gpg2 --no-permission-warning "
|
||||
|
||||
echo "Test: $pgmname" > ${pgmname}.log
|
||||
|
@ -1,2 +1,3 @@
|
||||
no-use-standard-socket
|
||||
use-standard-socket
|
||||
|
||||
|
||||
|
@ -1,3 +1,11 @@
|
||||
2010-10-14 Werner Koch <wk@g10code.com>
|
||||
|
||||
* gpg-connect-agent.c (start_agent): Rewrite using the
|
||||
start_new_gpg_agent function.
|
||||
|
||||
* gpgconf-comp.c (gpg_agent_runtime_change): Use gpg-connect-agent
|
||||
on all platforms.
|
||||
|
||||
2010-10-06 Werner Koch <wk@g10code.com>
|
||||
|
||||
* watchgnupg.c (print_version): Add option --time-only.
|
||||
|
@ -2156,131 +2156,28 @@ read_and_print_response (assuan_context_t ctx, int withhash, int *r_goterr)
|
||||
static assuan_context_t
|
||||
start_agent (void)
|
||||
{
|
||||
int rc = 0;
|
||||
char *infostr, *p;
|
||||
gpg_error_t err;
|
||||
assuan_context_t ctx;
|
||||
session_env_t session_env;
|
||||
|
||||
infostr = getenv ("GPG_AGENT_INFO");
|
||||
if (!infostr || !*infostr)
|
||||
{
|
||||
char *sockname;
|
||||
|
||||
rc = assuan_new (&ctx);
|
||||
if (rc)
|
||||
{
|
||||
log_error ("assuan_new failed: %s\n", gpg_strerror (rc));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
/* Check whether we can connect at the standard socket. */
|
||||
sockname = make_filename (opt.homedir, "S.gpg-agent", NULL);
|
||||
rc = assuan_socket_connect (ctx, sockname, 0, 0);
|
||||
|
||||
#ifdef HAVE_W32_SYSTEM
|
||||
/* If we failed to connect under Windows, we fire up the agent. */
|
||||
if (gpg_err_code (rc) == GPG_ERR_ASS_CONNECT_FAILED)
|
||||
{
|
||||
const char *agent_program;
|
||||
const char *argv[3];
|
||||
int save_rc = rc;
|
||||
|
||||
if (opt.verbose)
|
||||
log_info (_("no running gpg-agent - starting one\n"));
|
||||
agent_program = gnupg_module_name (GNUPG_MODULE_NAME_AGENT);
|
||||
|
||||
argv[0] = "--daemon";
|
||||
argv[1] = "--use-standard-socket";
|
||||
argv[2] = NULL;
|
||||
|
||||
rc = gnupg_spawn_process_detached (agent_program, argv, NULL);
|
||||
if (rc)
|
||||
log_debug ("failed to start agent `%s': %s\n",
|
||||
agent_program, gpg_strerror (rc));
|
||||
else
|
||||
{
|
||||
/* Give the agent some time to prepare itself. */
|
||||
gnupg_sleep (3);
|
||||
/* Now try again to connect the agent. */
|
||||
rc = assuan_new (&ctx);
|
||||
if (rc)
|
||||
{
|
||||
log_error ("assuan_new failed: %s\n", gpg_strerror (rc));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
rc = assuan_socket_connect (ctx, sockname, 0, 0);
|
||||
}
|
||||
if (rc)
|
||||
rc = save_rc;
|
||||
}
|
||||
#endif /*HAVE_W32_SYSTEM*/
|
||||
xfree (sockname);
|
||||
}
|
||||
else
|
||||
{
|
||||
int prot;
|
||||
int pid;
|
||||
|
||||
infostr = xstrdup (infostr);
|
||||
if ( !(p = strchr (infostr, PATHSEP_C)) || p == infostr)
|
||||
{
|
||||
log_error (_("malformed GPG_AGENT_INFO environment variable\n"));
|
||||
xfree (infostr);
|
||||
exit (1);
|
||||
}
|
||||
*p++ = 0;
|
||||
pid = atoi (p);
|
||||
while (*p && *p != PATHSEP_C)
|
||||
p++;
|
||||
prot = *p? atoi (p+1) : 0;
|
||||
if (prot != 1)
|
||||
{
|
||||
log_error (_("gpg-agent protocol version %d is not supported\n"),
|
||||
prot);
|
||||
xfree (infostr);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
rc = assuan_new (&ctx);
|
||||
if (rc)
|
||||
{
|
||||
log_error ("assuan_new failed: %s\n", gpg_strerror (rc));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
rc = assuan_socket_connect (ctx, infostr, pid, 0);
|
||||
xfree (infostr);
|
||||
}
|
||||
|
||||
if (rc)
|
||||
{
|
||||
log_error ("can't connect to the agent: %s\n", gpg_strerror (rc));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
if (opt.verbose)
|
||||
log_info ("connection to agent established\n");
|
||||
|
||||
rc = assuan_transact (ctx, "RESET", NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
if (rc)
|
||||
{
|
||||
log_error (_("error sending %s command: %s\n"), "RESET",
|
||||
gpg_strerror (rc));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
session_env = session_env_new ();
|
||||
if (!session_env)
|
||||
log_fatal ("error allocating session environment block: %s\n",
|
||||
strerror (errno));
|
||||
|
||||
rc = send_pinentry_environment (ctx, GPG_ERR_SOURCE_DEFAULT,
|
||||
NULL, NULL, session_env);
|
||||
err = start_new_gpg_agent (&ctx,
|
||||
GPG_ERR_SOURCE_DEFAULT,
|
||||
opt.homedir,
|
||||
NULL,
|
||||
NULL, NULL,
|
||||
session_env,
|
||||
!opt.quiet, 0,
|
||||
NULL, NULL);
|
||||
|
||||
session_env_release (session_env);
|
||||
if (rc)
|
||||
if (err)
|
||||
{
|
||||
log_error (_("error sending standard options: %s\n"), gpg_strerror (rc));
|
||||
log_error (_("error sending standard options: %s\n"), gpg_strerror (err));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
|
@ -1032,35 +1032,6 @@ struct error_line_s
|
||||
static void
|
||||
gpg_agent_runtime_change (void)
|
||||
{
|
||||
#ifndef HAVE_W32_SYSTEM
|
||||
char *agent = getenv ("GPG_AGENT_INFO");
|
||||
char *pid_str;
|
||||
unsigned long pid_long;
|
||||
char *tail;
|
||||
pid_t pid;
|
||||
|
||||
if (!agent)
|
||||
return;
|
||||
|
||||
pid_str = strchr (agent, ':');
|
||||
if (!pid_str)
|
||||
return;
|
||||
|
||||
pid_str++;
|
||||
errno = 0;
|
||||
pid_long = strtoul (pid_str, &tail, 0);
|
||||
if (errno || (*tail != ':' && *tail != '\0'))
|
||||
return;
|
||||
|
||||
pid = (pid_t) pid_long;
|
||||
|
||||
/* Check for overflow. */
|
||||
if (pid_long != (unsigned long) pid)
|
||||
return;
|
||||
|
||||
/* Ignore any errors here. */
|
||||
kill (pid, SIGHUP);
|
||||
#else
|
||||
gpg_error_t err;
|
||||
const char *pgmname;
|
||||
const char *argv[2];
|
||||
@ -1077,7 +1048,6 @@ gpg_agent_runtime_change (void)
|
||||
gc_error (0, 0, "error running `%s%s': %s",
|
||||
pgmname, " reloadagent", gpg_strerror (err));
|
||||
gnupg_release_process (pid);
|
||||
#endif /*!HAVE_W32_SYSTEM*/
|
||||
}
|
||||
|
||||
|
||||
|
@ -50,7 +50,6 @@ enum cmd_and_opt_values
|
||||
aCheckConfig,
|
||||
aListDirs,
|
||||
aReload
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -72,7 +71,7 @@ static ARGPARSE_OPTS opts[] =
|
||||
N_("list global configuration file") },
|
||||
{ aCheckConfig, "check-config", 256,
|
||||
N_("check global configuration file") },
|
||||
{ aReload, "reload", 256, "@" },
|
||||
{ aReload, "reload", 256, N_("reload all or a given component")},
|
||||
|
||||
{ 301, NULL, 0, N_("@\nOptions:\n ") },
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user