aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--agent/gpg-agent.c28
-rw-r--r--dirmngr/dirmngr.c13
-rw-r--r--doc/gpg-agent.texi9
3 files changed, 41 insertions, 9 deletions
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