1
0
Fork 0
mirror of git://git.gnupg.org/gnupg.git synced 2025-07-03 22:56:33 +02:00

Allow to run the test without a running agent.

Add new gpg-agent commands.
This commit is contained in:
Werner Koch 2010-05-11 17:52:00 +00:00
parent bf761927c9
commit ce9be10163
11 changed files with 102 additions and 38 deletions

View file

@ -1,3 +1,12 @@
2010-05-11 Werner Koch <wk@g10code.com>
* agent.h (opt): Add field USE_STANDARD_SOCKET.
* gpg-agent.c (use_standard_socket): Remove. Use new option instead.
* command.c (cmd_killagent, cmd_reloadagent): Provide command also
for non-W32 platforms.
(cmd_getinfo): New subcommands std_session_env and std_startup_env.
2010-05-04 Werner Koch <wk@g10code.com>
* gpg-agent.c (main): Add command --use-standard-socket-p.

View file

@ -61,6 +61,8 @@ struct
char *startup_lc_ctype;
char *startup_lc_messages;
/* True if we are listening on the standard socket. */
int use_standard_socket;
const char *pinentry_program; /* Filename of the program to start as
pinentry. */

View file

@ -59,10 +59,8 @@ struct server_local_s
char *keydesc; /* Allocated description for the next key
operation. */
int pause_io_logging; /* Used to suppress I/O logging during a command */
#ifdef HAVE_W32_SYSTEM
int stopme; /* If set to true the agent will be terminated after
the end of this session. */
#endif
int allow_pinentry_notify; /* Set if pinentry notifications should
be done. */
};
@ -1590,18 +1588,20 @@ cmd_updatestartuptty (assuan_context_t ctx, char *line)
#ifdef HAVE_W32_SYSTEM
static const char hlp_killagent[] =
"KILLAGENT\n"
"\n"
"Under Windows we start the agent on the fly. Thus it also make\n"
"sense to allow a client to stop the agent.";
"If the agent has been started using a standard socket\n"
"we allow a client to stop the agent.";
static gpg_error_t
cmd_killagent (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
(void)line;
if (!opt.use_standard_socket)
return set_error (GPG_ERR_NOT_SUPPORTED, "no --use-standard-socket");
ctrl->server_local->stopme = 1;
return gpg_error (GPG_ERR_EOF);
@ -1611,8 +1611,8 @@ cmd_killagent (assuan_context_t ctx, char *line)
static const char hlp_reloadagent[] =
"RELOADAGENT\n"
"\n"
"As signals are inconvenient under Windows, we provide this command\n"
"to allow reloading of the configuration.";
"This command is an alternative to SIGHUP\n"
"to reload the configuration.";
static gpg_error_t
cmd_reloadagent (assuan_context_t ctx, char *line)
{
@ -1622,7 +1622,6 @@ cmd_reloadagent (assuan_context_t ctx, char *line)
agent_sighup_action ();
return 0;
}
#endif /*HAVE_W32_SYSTEM*/
@ -1637,11 +1636,14 @@ static const char hlp_getinfo[] =
" socket_name - Return the name of the socket.\n"
" ssh_socket_name - Return the name of the ssh socket.\n"
" scd_running - Return OK if the SCdaemon is already running.\n"
" std_session_env - List the standard session environment.\n"
" std_startup_env - List the standard startup environment.\n"
" cmd_has_option\n"
" - Returns OK if the command CMD implements the option OPT.";
static gpg_error_t
cmd_getinfo (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
int rc = 0;
if (!strcmp (line, "version"))
@ -1685,6 +1687,34 @@ cmd_getinfo (assuan_context_t ctx, char *line)
snprintf (numbuf, sizeof numbuf, "%lu", get_standard_s2k_count ());
rc = assuan_send_data (ctx, numbuf, strlen (numbuf));
}
else if (!strcmp (line, "std_session_env")
|| !strcmp (line, "std_startup_env"))
{
int iterator;
const char *name, *value;
char *string;
iterator = 0;
while ((name = session_env_list_stdenvnames (&iterator, NULL)))
{
value = session_env_getenv_or_default
(line[5] == 't'? opt.startup_env:ctrl->session_env, name, NULL);
if (value)
{
string = xtryasprintf ("%s=%s", name, value);
if (!string)
rc = gpg_error_from_syserror ();
else
{
rc = assuan_send_data (ctx, string, strlen (string)+1);
if (!rc)
rc = assuan_send_data (ctx, NULL, 0);
}
if (rc)
break;
}
}
}
else if (!strncmp (line, "cmd_has_option", 14)
&& (line[14] == ' ' || line[14] == '\t' || !line[14]))
{
@ -1881,10 +1911,8 @@ register_commands (assuan_context_t ctx)
{ "GETVAL", cmd_getval, hlp_getval },
{ "PUTVAL", cmd_putval, hlp_putval },
{ "UPDATESTARTUPTTY", cmd_updatestartuptty, hlp_updatestartuptty },
#ifdef HAVE_W32_SYSTEM
{ "KILLAGENT", cmd_killagent, hlp_killagent },
{ "RELOADAGENT", cmd_reloadagent,hlp_reloadagent },
#endif
{ "GETINFO", cmd_getinfo, hlp_getinfo },
{ NULL }
};
@ -1991,10 +2019,8 @@ start_command_handler (ctrl_t ctrl, gnupg_fd_t listen_fd, gnupg_fd_t fd)
/* Cleanup. */
assuan_release (ctx);
#ifdef HAVE_W32_SYSTEM
if (ctrl->server_local->stopme)
agent_exit (0);
#endif
xfree (ctrl->server_local);
ctrl->server_local = NULL;
}

View file

@ -217,9 +217,6 @@ static int shutdown_pending;
/* Counter for the currently running own socket checks. */
static int check_own_socket_running;
/* True if we are listening on the standard socket. */
static int use_standard_socket;
/* It is possible that we are currently running under setuid permissions */
static int maybe_setuid = 1;
@ -631,8 +628,8 @@ main (int argc, char **argv )
/* Set default options. */
parse_rereadable_options (NULL, 0); /* Reset them to default values. */
#ifdef USE_STANDARD_SOCKET
use_standard_socket = 1; /* Under Windows we always use a standard
socket. */
opt.use_standard_socket = 1; /* Under Windows we always use a standard
socket. */
#endif
shell = getenv ("SHELL");
@ -783,8 +780,8 @@ main (int argc, char **argv )
case oXauthority: default_xauthority = xstrdup (pargs.r.ret_str);
break;
case oUseStandardSocket: use_standard_socket = 1; break;
case oNoUseStandardSocket: use_standard_socket = 0; break;
case oUseStandardSocket: opt.use_standard_socket = 1; break;
case oNoUseStandardSocket: opt.use_standard_socket = 0; break;
case oFakedSystemTime:
{
@ -862,7 +859,7 @@ main (int argc, char **argv )
}
if (gpgconf_list == 3)
agent_exit (!use_standard_socket);
agent_exit (!opt.use_standard_socket);
if (gpgconf_list == 2)
agent_exit (0);
if (gpgconf_list)
@ -1437,7 +1434,7 @@ create_socket_name (char *standard_name, char *template)
{
char *name, *p;
if (use_standard_socket)
if (opt.use_standard_socket)
name = make_filename (opt.homedir, standard_name, NULL);
else
{
@ -1500,7 +1497,7 @@ create_server_socket (char *name, int is_ssh, assuan_sock_nonce_t *nonce)
strcpy (serv_addr->sun_path, name);
len = SUN_LEN (serv_addr);
rc = assuan_sock_bind (fd, (struct sockaddr*) serv_addr, len);
if (use_standard_socket && rc == -1 && errno == EADDRINUSE)
if (opt.use_standard_socket && rc == -1 && errno == EADDRINUSE)
{
/* Check whether a gpg-agent is already running on the standard
socket. We do this test only if this is not the ssh socket.
@ -1533,7 +1530,7 @@ create_server_socket (char *name, int is_ssh, assuan_sock_nonce_t *nonce)
gpg_strerror (gpg_error_from_errno (errno)));
assuan_sock_close (fd);
if (use_standard_socket)
if (opt.use_standard_socket)
*name = 0; /* Inhibit removal of the socket by cleanup(). */
agent_exit (2);
}
@ -2170,7 +2167,7 @@ check_own_socket (void)
char *sockname;
pth_attr_t tattr;
if (!use_standard_socket)
if (!opt.use_standard_socket)
return; /* This check makes only sense in standard socket mode. */
if (check_own_socket_running || shutdown_pending)