aboutsummaryrefslogtreecommitdiffstats
path: root/common/asshelp.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2014-10-03 09:58:58 +0000
committerWerner Koch <[email protected]>2014-10-03 09:58:58 +0000
commit9c380384dafb213334f8834178c5ceb0bf33db6e (patch)
tree3522eab22d31542094d95c605394542a857e1c55 /common/asshelp.c
parentgpg: Fix regression removing SHA256. (diff)
downloadgnupg-9c380384dafb213334f8834178c5ceb0bf33db6e.tar.gz
gnupg-9c380384dafb213334f8834178c5ceb0bf33db6e.zip
Remove support for the GPG_AGENT_INFO envvar.
* agent/agent.h (opt): Remove field use_standard_socket. * agent/command.c (cmd_killagent): Always allow killing. * agent/gpg-agent.c (main): Turn --{no,}use-standard-socket and --write-env-file into dummy options. Always return true for --use-standard-socket-p. Do not print the GPG_AGENT_INFO envvar setting or set that envvar. (create_socket_name): Simplify by removing non standard socket support. (check_for_running_agent): Ditto. * common/asshelp.c (start_new_gpg_agent): Remove GPG_AGENT_INFO use. * common/simple-pwquery.c (agent_open): Ditto. * configure.ac (GPG_AGENT_INFO_NAME): Remove. * g10/server.c (gpg_server): Do not print the AgentInfo comment. * g13/server.c (g13_server): Ditto. * sm/server.c (gpgsm_server): Ditto. * tools/gpgconf.c (main): Simplify by removing non standard socket support. -- The indented fix to allow using a different socket than the one in the gnupg home directory is to change Libassuan to check whether the socket files exists as a regualr file with a special keyword to redirect to another socket file name.
Diffstat (limited to 'common/asshelp.c')
-rw-r--r--common/asshelp.c255
1 files changed, 74 insertions, 181 deletions
diff --git a/common/asshelp.c b/common/asshelp.c
index 5e3f66359..e97d39603 100644
--- a/common/asshelp.c
+++ b/common/asshelp.c
@@ -359,14 +359,11 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
gpg_error_t (*status_cb)(ctrl_t, int, ...),
ctrl_t status_cb_arg)
{
- /* If we ever failed to connect via a socket we will force the use
- of the pipe based server for the lifetime of the process. */
- static int force_pipe_server = 0;
-
- gpg_error_t err = 0;
- char *infostr, *p;
+ gpg_error_t err;
assuan_context_t ctx;
int did_success_msg = 0;
+ char *sockname;
+ const char *argv[5];
*r_ctx = NULL;
@@ -377,200 +374,96 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
return err;
}
- restart:
- infostr = force_pipe_server? NULL : getenv (GPG_AGENT_INFO_NAME);
- if (!infostr || !*infostr)
+ sockname = make_absfilename (homedir, GPG_AGENT_SOCK_NAME, NULL);
+ err = assuan_socket_connect (ctx, sockname, 0, 0);
+ if (err)
{
- char *sockname;
- const char *argv[5];
- pid_t pid;
- int excode;
-
- /* First check whether we can connect at the standard
- socket. */
- sockname = make_absfilename (homedir, GPG_AGENT_SOCK_NAME, NULL);
- err = assuan_socket_connect (ctx, sockname, 0, 0);
+ char *abs_homedir;
+ lock_spawn_t lock;
- if (err)
- {
- char *abs_homedir;
+ /* With no success start a new server. */
+ if (!agent_program || !*agent_program)
+ agent_program = gnupg_module_name (GNUPG_MODULE_NAME_AGENT);
- /* With no success start a new server. */
- if (!agent_program || !*agent_program)
- agent_program = gnupg_module_name (GNUPG_MODULE_NAME_AGENT);
+ if (verbose)
+ log_info (_("no running gpg-agent - starting '%s'\n"),
+ agent_program);
- if (verbose)
- log_info (_("no running gpg-agent - starting '%s'\n"),
- agent_program);
+ if (status_cb)
+ status_cb (status_cb_arg, STATUS_PROGRESS,
+ "starting_agent ? 0 0", NULL);
- if (status_cb)
- status_cb (status_cb_arg, STATUS_PROGRESS,
- "starting_agent ? 0 0", NULL);
+ /* We better pass an absolute home directory to the agent just
+ in case gpg-agent does not convert the passed name to an
+ absolute one (which it should do). */
+ abs_homedir = make_absfilename_try (homedir, NULL);
+ if (!abs_homedir)
+ {
+ gpg_error_t tmperr = gpg_err_make (errsource,
+ gpg_err_code_from_syserror ());
+ log_error ("error building filename: %s\n",gpg_strerror (tmperr));
+ xfree (sockname);
+ assuan_release (ctx);
+ return tmperr;
+ }
- /* We better pass an absolute home directory to the agent
- just in casee gpg-agent does not convert the passed name
- to an absolute one (which it should do). */
- abs_homedir = make_absfilename_try (homedir, NULL);
- if (!abs_homedir)
- {
- gpg_error_t tmperr = gpg_err_make (errsource,
- gpg_err_code_from_syserror ());
- log_error ("error building filename: %s\n",gpg_strerror (tmperr));
- xfree (sockname);
- assuan_release (ctx);
- return tmperr;
- }
+ if (fflush (NULL))
+ {
+ gpg_error_t tmperr = gpg_err_make (errsource,
+ gpg_err_code_from_syserror ());
+ log_error ("error flushing pending output: %s\n",
+ strerror (errno));
+ xfree (sockname);
+ assuan_release (ctx);
+ xfree (abs_homedir);
+ return tmperr;
+ }
- if (fflush (NULL))
- {
- gpg_error_t tmperr = gpg_err_make (errsource,
- gpg_err_code_from_syserror ());
- log_error ("error flushing pending output: %s\n",
- strerror (errno));
- xfree (sockname);
- assuan_release (ctx);
- xfree (abs_homedir);
- return tmperr;
- }
+ /* If the agent has been configured for use with a standard
+ socket, an environment variable is not required and thus
+ we we can savely start the agent here. */
- argv[0] = "--homedir";
- argv[1] = abs_homedir;
- argv[2] = "--use-standard-socket-p";
- argv[3] = NULL;
- err = gnupg_spawn_process_fd (agent_program, argv, -1, -1, -1, &pid);
+ argv[0] = "--homedir";
+ argv[1] = abs_homedir;
+ argv[2] = "--use-standard-socket";
+ argv[3] = "--daemon";
+ argv[4] = NULL;
+
+ if (!(err = lock_spawning (&lock, homedir, "agent", verbose))
+ && assuan_socket_connect (ctx, sockname, 0, 0))
+ {
+ err = gnupg_spawn_process_detached (agent_program, argv,NULL);
if (err)
- log_debug ("starting '%s' for testing failed: %s\n",
+ log_error ("failed to start agent '%s': %s\n",
agent_program, gpg_strerror (err));
- else if ((err = gnupg_wait_process (agent_program, pid, 1, &excode)))
+ else
{
- if (excode == -1)
- log_debug ("running '%s' for testing failed (wait): %s\n",
- agent_program, gpg_strerror (err));
- }
- gnupg_release_process (pid);
+ int i;
- if (!err && !excode)
- {
- /* If the agent has been configured for use with a
- standard socket, an environment variable is not
- required and thus we we can savely start the agent
- here. */
- lock_spawn_t lock;
-
- argv[0] = "--homedir";
- argv[1] = abs_homedir;
- argv[2] = "--use-standard-socket";
- argv[3] = "--daemon";
- argv[4] = NULL;
-
- if (!(err = lock_spawning (&lock, homedir, "agent", verbose))
- && assuan_socket_connect (ctx, sockname, 0, 0))
+ for (i=0; i < SECS_TO_WAIT_FOR_AGENT; i++)
{
- err = gnupg_spawn_process_detached (agent_program, argv,NULL);
- if (err)
- log_error ("failed to start agent '%s': %s\n",
- agent_program, gpg_strerror (err));
- else
+ 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)
{
- int i;
-
- for (i=0; i < SECS_TO_WAIT_FOR_AGENT; i++)
+ if (verbose)
{
- 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;
- }
+ log_info (_("connection to agent established\n"));
+ did_success_msg = 1;
}
+ break;
}
}
-
- unlock_spawning (&lock, "agent");
}
- else
- {
- /* If using the standard socket is not the default we
- start the agent as a pipe server which gives us most
- of the required features except for passphrase
- caching etc. */
- const char *pgmname;
- assuan_fd_t no_close_list[3];
- int i;
-
- if ( !(pgmname = strrchr (agent_program, '/')))
- pgmname = agent_program;
- else
- pgmname++;
-
- argv[0] = pgmname; /* (Assuan expects a standard argv.) */
- argv[1] = "--homedir";
- argv[2] = abs_homedir;
- argv[3] = "--server";
- argv[4] = NULL;
-
- i=0;
- if (log_get_fd () != -1)
- no_close_list[i++] = assuan_fd_from_posix_fd (log_get_fd ());
- no_close_list[i++] = assuan_fd_from_posix_fd (fileno (stderr));
- no_close_list[i] = ASSUAN_INVALID_FD;
-
- /* Connect to the agent and perform initial handshaking. */
- err = assuan_pipe_connect (ctx, agent_program, argv,
- no_close_list, NULL, NULL, 0);
- }
- xfree (abs_homedir);
}
- xfree (sockname);
- }
- else
- {
- int prot;
- int pid;
- infostr = xstrdup (infostr);
- if ( !(p = strchr (infostr, PATHSEP_C)) || p == infostr)
- {
- log_error (_("malformed %s environment variable\n"),
- GPG_AGENT_INFO_NAME);
- xfree (infostr);
- force_pipe_server = 1;
- goto restart;
- }
- *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);
- force_pipe_server = 1;
- goto restart;
- }
-
- err = assuan_socket_connect (ctx, infostr, pid, 0);
- xfree (infostr);
- if (gpg_err_code (err) == GPG_ERR_ASS_CONNECT_FAILED)
- {
- log_info (_("can't connect to the agent - trying fall back\n"));
- force_pipe_server = 1;
- goto restart;
- }
+ unlock_spawning (&lock, "agent");
+ xfree (abs_homedir);
}
-
+ xfree (sockname);
if (err)
{
log_error ("can't connect to the agent: %s\n", gpg_strerror (err));
@@ -582,11 +475,11 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
log_debug (_("connection to agent established\n"));
err = assuan_transact (ctx, "RESET",
- NULL, NULL, NULL, NULL, NULL, NULL);
+ NULL, NULL, NULL, NULL, NULL, NULL);
if (!err)
err = send_pinentry_environment (ctx, errsource,
- opt_lc_ctype, opt_lc_messages,
- session_env);
+ opt_lc_ctype, opt_lc_messages,
+ session_env);
if (err)
{
assuan_release (ctx);