diff options
author | Werner Koch <[email protected]> | 2010-05-11 18:00:31 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2010-05-11 18:00:31 +0000 |
commit | f5551672fb82af31a22e3b649cd270a467dbadd9 (patch) | |
tree | 06eb2551200ea6a353c44b1e2d278479bb277ba1 /agent | |
parent | Fix for bug 1223 (diff) | |
download | gnupg-f5551672fb82af31a22e3b649cd270a467dbadd9.tar.gz gnupg-f5551672fb82af31a22e3b649cd270a467dbadd9.zip |
Update tests.
Diffstat (limited to 'agent')
-rw-r--r-- | agent/ChangeLog | 9 | ||||
-rw-r--r-- | agent/agent.h | 3 | ||||
-rw-r--r-- | agent/command.c | 50 | ||||
-rw-r--r-- | agent/gpg-agent.c | 21 |
4 files changed, 59 insertions, 24 deletions
diff --git a/agent/ChangeLog b/agent/ChangeLog index 830b4c2c1..35ea9e038 100644 --- a/agent/ChangeLog +++ b/agent/ChangeLog @@ -1,3 +1,12 @@ +2010-05-11 Werner Koch <[email protected]> + + * 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-03 Werner Koch <[email protected]> * gpg-agent.c (check_own_socket_thread): Do not release SOCKNAME diff --git a/agent/agent.h b/agent/agent.h index 3f0c19561..09519d48b 100644 --- a/agent/agent.h +++ b/agent/agent.h @@ -55,6 +55,9 @@ struct int batch; /* Batch mode */ const char *homedir; /* Configuration directory name */ + /* True if we are listening on the standard socket. */ + int use_standard_socket; + /* Environment setting gathered at program start or changed using the Assuan command UPDATESTARTUPTTY. */ session_env_t startup_env; diff --git a/agent/command.c b/agent/command.c index b78dc07d9..082e730bd 100644 --- a/agent/command.c +++ b/agent/command.c @@ -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. */ }; @@ -1591,18 +1589,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); @@ -1612,8 +1612,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) { @@ -1623,7 +1623,6 @@ cmd_reloadagent (assuan_context_t ctx, char *line) agent_sighup_action (); return 0; } -#endif /*HAVE_W32_SYSTEM*/ @@ -1639,11 +1638,14 @@ static const char hlp_getinfo[] = " ssh_socket_name - Return the name of the ssh socket.\n" " scd_running - Return OK if the SCdaemon is already running.\n" " s2k_count - Return the calibrated S2K count.\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")) @@ -1687,6 +1689,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])) { @@ -1883,10 +1913,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 } }; @@ -1993,10 +2021,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; } diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 6d96b5223..35871ab9a 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -219,9 +219,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,7 +628,7 @@ 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; + opt.use_standard_socket = 1; #endif shell = getenv ("SHELL"); @@ -782,8 +779,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,9 +859,9 @@ main (int argc, char **argv ) if (gpgconf_list == 3) { - if (use_standard_socket && !opt.quiet) + if (opt.use_standard_socket && !opt.quiet) log_info ("configured to use the standard socket\n"); - agent_exit (!use_standard_socket); + agent_exit (!opt.use_standard_socket); } else if (gpgconf_list == 2) agent_exit (0); @@ -1438,7 +1435,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 { @@ -1504,7 +1501,7 @@ create_server_socket (char *name, int is_ssh, assuan_sock_nonce_t *nonce) /* Our error code mapping on W32CE returns EEXIST thus we also test for this. */ - if (use_standard_socket && rc == -1 + if (opt.use_standard_socket && rc == -1 && (errno == EADDRINUSE #ifdef HAVE_W32_SYSTEM || errno == EEXIST @@ -1542,7 +1539,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); } @@ -2169,7 +2166,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) |