aboutsummaryrefslogtreecommitdiffstats
path: root/common/simple-pwquery.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--common/simple-pwquery.c49
1 files changed, 44 insertions, 5 deletions
diff --git a/common/simple-pwquery.c b/common/simple-pwquery.c
index f0c1cdc00..217ca69cd 100644
--- a/common/simple-pwquery.c
+++ b/common/simple-pwquery.c
@@ -1,5 +1,5 @@
/* simple-pwquery.c - A simple password query client for gpg-agent
- * Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+ * Copyright (C) 2002, 2004, 2007 Free Software Foundation, Inc.
*
* This file is part of GnuPG.
*
@@ -68,6 +68,11 @@
#endif
+/* Name of the socket to be used if GPG_AGENT_INFO has not been
+ set. No default socket is used if this is NULL. */
+static char *default_gpg_agent_info;
+
+
@@ -154,9 +159,9 @@ readline (int fd, char *buf, size_t buflen)
;
if (n)
{
- break; /* at least one full line available - that's enough.
+ break; /* At least one full line available - that's enough.
This function is just a simple implementation, so
- it is okay to forget about pending bytes */
+ it is okay to forget about pending bytes. */
}
}
@@ -305,6 +310,8 @@ agent_open (int *rfd)
*rfd = -1;
infostr = getenv ( "GPG_AGENT_INFO" );
if ( !infostr || !*infostr )
+ infostr = default_gpg_agent_info;
+ if ( !infostr || !*infostr )
{
#ifdef SPWQ_USE_LOGGING
log_error (_("gpg-agent is not available in this session\n"));
@@ -322,6 +329,9 @@ agent_open (int *rfd)
{
#ifdef SPWQ_USE_LOGGING
log_error ( _("malformed GPG_AGENT_INFO environment variable\n"));
+ log_debug ( "a='%s'\n", infostr);
+ log_debug ( "a='%s'\n", strchr ( infostr, PATHSEP_C));
+ log_debug ( "a=%td\n", (p-infostr));
#endif
return SPWQ_NO_AGENT;
}
@@ -425,13 +435,34 @@ copy_and_escape (char *buffer, const char *text)
}
+/* Set the name of the default socket to NAME. */
+int
+simple_pw_set_socket (const char *name)
+{
+ spwq_free (default_gpg_agent_info);
+ if (name)
+ {
+ default_gpg_agent_info = spwq_malloc (strlen (name) + 4 + 1);
+ if (!default_gpg_agent_info)
+ return SPWQ_OUT_OF_CORE;
+ /* We don't know the PID thus we use 0. */
+ strcpy (stpcpy (default_gpg_agent_info, name),
+ PATHSEP_S "0" PATHSEP_S "1");
+ }
+ else
+ default_gpg_agent_info = NULL;
+
+ return 0;
+}
+
+
/* Ask the gpg-agent for a passphrase and present the user with a
DESCRIPTION, a PROMPT and optionally with a TRYAGAIN extra text.
If a CACHEID is not NULL it is used to locate the passphrase in in
the cache and store it under this ID. If OPT_CHECK is true
gpg-agent is asked to apply some checks on the passphrase security.
If ERRORCODE is not NULL it should point a variable receiving an
- errorcode; this errocode might be 0 if the user canceled the
+ errorcode; this error code might be 0 if the user canceled the
operation. The function returns NULL to indicate an error. */
char *
simple_pwquery (const char *cacheid,
@@ -530,7 +561,15 @@ simple_pwquery (const char *cacheid,
#ifdef SPWQ_USE_LOGGING
log_info (_("canceled by user\n") );
#endif
- *errorcode = 0; /* canceled */
+ *errorcode = 0; /* Special error code to indicate Cancel. */
+ }
+ else if (nread > 4 && !memcmp (pw, "ERR ", 4))
+ {
+ switch ( (strtoul (pw+4, NULL, 0) & 0xffff) )
+ {
+ case 85: rc = SPWQ_NO_PIN_ENTRY; break;
+ default: rc = SPWQ_GENERAL_ERROR; break;
+ }
}
else
{