aboutsummaryrefslogtreecommitdiffstats
path: root/sm
diff options
context:
space:
mode:
Diffstat (limited to 'sm')
-rw-r--r--sm/ChangeLog5
-rw-r--r--sm/call-dirmngr.c50
-rw-r--r--sm/gpgsm.c7
-rw-r--r--sm/gpgsm.h1
4 files changed, 44 insertions, 19 deletions
diff --git a/sm/ChangeLog b/sm/ChangeLog
index 6dd5a28f3..acfa7f3bd 100644
--- a/sm/ChangeLog
+++ b/sm/ChangeLog
@@ -1,3 +1,8 @@
+2004-11-23 Werner Koch <[email protected]>
+
+ * gpgsm.c: New option --prefer-system-dirmngr.
+ * call-dirmngr.c (start_dirmngr): Implement this option.
+
2004-10-22 Werner Koch <[email protected]>
* certreqgen.c (gpgsm_genkey): Remove the NEW from the certificate
diff --git a/sm/call-dirmngr.c b/sm/call-dirmngr.c
index 849b8a04c..c70f56580 100644
--- a/sm/call-dirmngr.c
+++ b/sm/call-dirmngr.c
@@ -35,6 +35,8 @@
#include "i18n.h"
#include "keydb.h"
+/* The name of the socket for a system daemon. */
+#define DEFAULT_SOCKET_NAME "/var/run/dirmngr/socket"
struct membuf {
size_t len;
@@ -145,6 +147,7 @@ start_dirmngr (void)
int rc;
char *infostr, *p;
ASSUAN_CONTEXT ctx;
+ int try_default = 0;
if (dirmngr_ctx)
return 0; /* fixme: We need a context for each thread or serialize
@@ -153,6 +156,12 @@ start_dirmngr (void)
to take care of the implicit option sending caching. */
infostr = force_pipe_server? NULL : getenv ("DIRMNGR_INFO");
+ if (opt.prefer_system_dirmngr && !force_pipe_server
+ &&(!infostr || !*infostr))
+ {
+ infostr = DEFAULT_SOCKET_NAME;
+ try_default = 1;
+ }
if (!infostr || !*infostr)
{
const char *pgmname;
@@ -197,26 +206,31 @@ start_dirmngr (void)
int pid;
infostr = xstrdup (infostr);
- if ( !(p = strchr (infostr, ':')) || p == infostr)
+ if (!try_default && *infostr)
{
- log_error (_("malformed DIRMNGR_INFO environment variable\n"));
- xfree (infostr);
- force_pipe_server = 1;
- return start_dirmngr ();
- }
- *p++ = 0;
- pid = atoi (p);
- while (*p && *p != ':')
- p++;
- prot = *p? atoi (p+1) : 0;
- if (prot != 1)
- {
- log_error (_("dirmngr protocol version %d is not supported\n"),
- prot);
- xfree (infostr);
- force_pipe_server = 1;
- return start_dirmngr ();
+ if ( !(p = strchr (infostr, ':')) || p == infostr)
+ {
+ log_error (_("malformed DIRMNGR_INFO environment variable\n"));
+ xfree (infostr);
+ force_pipe_server = 1;
+ return start_dirmngr ();
+ }
+ *p++ = 0;
+ pid = atoi (p);
+ while (*p && *p != ':')
+ p++;
+ prot = *p? atoi (p+1) : 0;
+ if (prot != 1)
+ {
+ log_error (_("dirmngr protocol version %d is not supported\n"),
+ prot);
+ xfree (infostr);
+ force_pipe_server = 1;
+ return start_dirmngr ();
+ }
}
+ else
+ pid = -1;
rc = assuan_socket_connect (&ctx, infostr, pid);
xfree (infostr);
diff --git a/sm/gpgsm.c b/sm/gpgsm.c
index 0f620c091..c9ce8fd9f 100644
--- a/sm/gpgsm.c
+++ b/sm/gpgsm.c
@@ -107,6 +107,7 @@ enum cmd_and_opt_values {
oLCctype,
oLCmessages,
+ oPreferSystemDirmngr,
oDirmngrProgram,
oProtectToolProgram,
oFakedSystemTime,
@@ -272,7 +273,8 @@ static ARGPARSE_OPTS opts[] = {
{ oRecipient, "recipient", 2, N_("|NAME|encrypt for NAME")},
-
+ { oPreferSystemDirmngr,"prefer-system-dirmngr", 0,
+ N_("use system's dirmngr if available")},
{ oDisableCRLChecks, "disable-crl-checks", 0, N_("never consult a CRL")},
{ oEnableCRLChecks, "enable-crl-checks", 0, "@"},
{ oForceCRLRefresh, "force-crl-refresh", 0, "@"},
@@ -1047,6 +1049,7 @@ main ( int argc, char **argv)
case oLCctype: opt.lc_ctype = xstrdup (pargs.r.ret_str); break;
case oLCmessages: opt.lc_messages = xstrdup (pargs.r.ret_str); break;
case oDirmngrProgram: opt.dirmngr_program = pargs.r.ret_str; break;
+ case oPreferSystemDirmngr: opt.prefer_system_dirmngr = 1; break;
case oProtectToolProgram:
opt.protect_tool_program = pargs.r.ret_str;
break;
@@ -1333,6 +1336,8 @@ main ( int argc, char **argv)
GC_OPT_FLAG_NONE );
printf ("auto-issuer-key-retrieve:%lu:\n",
GC_OPT_FLAG_NONE );
+ printf ("prefer-system-dirmngr:%lu:\n",
+ GC_OPT_FLAG_NONE );
}
break;
diff --git a/sm/gpgsm.h b/sm/gpgsm.h
index 18f50e9fe..faa6e8b5c 100644
--- a/sm/gpgsm.h
+++ b/sm/gpgsm.h
@@ -55,6 +55,7 @@ struct {
char *lc_messages;
const char *dirmngr_program;
+ int prefer_system_dirmngr; /* Prefer using a system wide drimngr. */
const char *protect_tool_program;
char *outfile; /* name of output file */