diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 2c4d313f5..46fb840bb 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -118,6 +118,7 @@ enum cmd_and_opt_values oEnablePassphraseHistory, oDisableExtendedKeyFormat, oEnableExtendedKeyFormat, + oStealSocket, oUseStandardSocket, oNoUseStandardSocket, oExtraSocket, @@ -171,6 +172,7 @@ static gpgrt_opt_t opts[] = { ARGPARSE_s_n (oNoDetach, "no-detach", N_("do not detach from the console")), ARGPARSE_s_n (oSh, "sh", N_("sh-style command output")), ARGPARSE_s_n (oCsh, "csh", N_("csh-style command output")), + ARGPARSE_s_n (oStealSocket, "steal-socket", "@"), ARGPARSE_s_s (oDisplay, "display", "@"), ARGPARSE_s_s (oTTYname, "ttyname", "@"), ARGPARSE_s_s (oTTYtype, "ttytype", "@"), @@ -382,6 +384,9 @@ static int disable_check_own_socket; /* Flag indicating that we are in supervised mode. */ static int is_supervised; +/* Flag indicating to start the daemon even if one already runs. */ +static int steal_socket; + /* Flag to inhibit socket removal in cleanup. */ static int inhibit_socket_removal; @@ -1238,6 +1243,7 @@ main (int argc, char **argv) case oSh: csh_style = 0; break; case oServer: pipe_server = 1; break; case oDaemon: is_daemon = 1; break; + case oStealSocket: steal_socket = 1; break; case oSupervised: is_supervised = 1; break; case oDisplay: default_display = xstrdup (pargs.r.ret_str); break; @@ -2239,14 +2245,20 @@ create_server_socket (char *name, int primary, int cygwin, server is not yet operational; this would lead to a hang. */ if (primary && !check_for_running_agent (1)) { - log_set_prefix (NULL, GPGRT_LOG_WITH_PREFIX); - log_set_file (NULL); - log_error (_("a gpg-agent is already running - " - "not starting a new one\n")); - *name = 0; /* Inhibit removal of the socket by cleanup(). */ - assuan_sock_close (fd); - xfree (unaddr); - agent_exit (2); + if (steal_socket) + log_info (N_("trying to steal socket from running %s\n"), + "gpg-agent"); + else + { + log_set_prefix (NULL, GPGRT_LOG_WITH_PREFIX); + log_set_file (NULL); + log_error (_("a gpg-agent is already running - " + "not starting a new one\n")); + *name = 0; /* Inhibit removal of the socket by cleanup(). */ + assuan_sock_close (fd); + xfree (unaddr); + agent_exit (2); + } } gnupg_remove (unaddr->sun_path); rc = assuan_sock_bind (fd, addr, len); diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c index 51a586e20..78ca4b215 100644 --- a/dirmngr/dirmngr.c +++ b/dirmngr/dirmngr.c @@ -140,6 +140,7 @@ enum cmd_and_opt_values { oForce, oAllowOCSP, oAllowVersionCheck, + oStealSocket, oSocketName, oLDAPWrapperProgram, oHTTPWrapperProgram, @@ -186,6 +187,7 @@ static gpgrt_opt_t opts[] = { ARGPARSE_s_n (oNoDetach, "no-detach", N_("do not detach from the console")), ARGPARSE_s_n (oSh, "sh", N_("sh-style command output")), ARGPARSE_s_n (oCsh, "csh", N_("csh-style command output")), + ARGPARSE_s_n (oStealSocket, "steal-socket", "@"), ARGPARSE_s_s (oHomedir, "homedir", "@"), ARGPARSE_conffile (oOptions, "options", N_("|FILE|read options from FILE")), ARGPARSE_noconffile (oNoOptions, "no-options", "@"), @@ -363,6 +365,10 @@ static volatile int shutdown_pending; /* Flags to indicate that we shall not watch our own socket. */ static int disable_check_own_socket; +/* Flag indicating to start the daemon even if one already runs. */ +static int steal_socket; + + /* Flag to control the Tor mode. */ static enum { TOR_MODE_AUTO = 0, /* Switch to NO or YES */ @@ -1095,6 +1101,7 @@ main (int argc, char **argv) case oNoVerbose: opt.verbose = 0; break; case oHomedir: /* Ignore this option here. */; break; case oNoDetach: nodetach = 1; break; + case oStealSocket: steal_socket = 1; break; case oLogFile: logfile = pargs.r.ret_str; break; case oCsh: csh_style = 1; break; case oSh: csh_style = 0; break; @@ -1371,7 +1378,11 @@ main (int argc, char **argv) #endif )) { - /* Fixme: We should test whether a dirmngr is already running. */ + /* Fixme: We should actually test whether a dirmngr is + * already running. For now the steal option is a dummy. */ + /* if (steal_socket) */ + /* log_info (N_("trying to steal socket from running %s\n"), */ + /* "dirmngr"); */ gnupg_remove (redir_socket_name? redir_socket_name : socket_name); rc = assuan_sock_bind (fd, (struct sockaddr*) &serv_addr, len); } diff --git a/doc/gpg-agent.texi b/doc/gpg-agent.texi index f20d83384..6c2330dc6 100644 --- a/doc/gpg-agent.texi +++ b/doc/gpg-agent.texi @@ -297,6 +297,15 @@ Pinentry. As of now it is only useful when used along with Don't detach the process from the console. This is mainly useful for debugging. +@item --steal-socket +@opindex steal-socket +In @option{--daemon} mode, gpg-agent detects an already running +gpg-agent and does not allow to start a new instance. This option can +be used to override this check: the new gpg-agent process will try to +take over the communication sockets from the already running process +and start anyway. This option should in general not be used. + + @item -s @itemx --sh @itemx -c