aboutsummaryrefslogtreecommitdiffstats
path: root/g10
diff options
context:
space:
mode:
Diffstat (limited to 'g10')
-rw-r--r--g10/ChangeLog7
-rw-r--r--g10/cardglue.c4
-rw-r--r--g10/keydb.h2
-rw-r--r--g10/passphrase.c33
4 files changed, 39 insertions, 7 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog
index a27c70901..9b1f0336a 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,3 +1,10 @@
+2005-07-26 Werner Koch <[email protected]>
+
+ * passphrase.c (agent_get_passphrase): Make sure to release the
+ saved codeset.
+ (agent_open): Add arg ORIG_CODESET and switch back to it in case
+ of error. Changed all callers.
+
2005-07-22 David Shaw <[email protected]>
* keyedit.c (sign_uids): Don't prompt for setting signature expiry
diff --git a/g10/cardglue.c b/g10/cardglue.c
index 0e2da279c..14feb4188 100644
--- a/g10/cardglue.c
+++ b/g10/cardglue.c
@@ -83,7 +83,7 @@ static assuan_error_t learn_status_cb (void *opaque, const char *line);
#define ASSUAN_LINELENGTH 100
static assuan_context_t
-agent_open (int try)
+agent_open (int try, const char *orig_codeset)
{
return NULL;
}
@@ -338,7 +338,7 @@ open_card_via_agent (int *scd_available)
int rc;
*scd_available = 0;
- ctx = agent_open (1);
+ ctx = agent_open (1, NULL);
if (!ctx)
return NULL;
diff --git a/g10/keydb.h b/g10/keydb.h
index e7b4292f6..bf7ccd1d9 100644
--- a/g10/keydb.h
+++ b/g10/keydb.h
@@ -189,7 +189,7 @@ int build_sk_list( STRLIST locusr, SK_LIST *ret_sk_list,
/*-- passphrase.h --*/
#ifdef ENABLE_AGENT_SUPPORT
-assuan_context_t agent_open (int try);
+assuan_context_t agent_open (int try, const char *orig_codeset);
void agent_close (assuan_context_t ctx);
#else
/* If we build w/o agent support, assuan.h won't get included and thus
diff --git a/g10/passphrase.c b/g10/passphrase.c
index 862411184..85b82ca4e 100644
--- a/g10/passphrase.c
+++ b/g10/passphrase.c
@@ -275,10 +275,12 @@ agent_send_all_options (assuan_context_t ctx)
* Returns: -1 on error; on success an Assuan context for that
* connection is returned. With TRY set to true, no error messages
* are printed and the use of the agent won't get disabled on failure.
+ * If ORIG_CODESET is not NULL, the function will swithc the codeset
+ * back to that one before printing error messages.
*/
#ifdef ENABLE_AGENT_SUPPORT
assuan_context_t
-agent_open (int try)
+agent_open (int try, const char *orig_codeset)
{
int rc;
assuan_context_t ctx;
@@ -295,6 +297,10 @@ agent_open (int try)
{
if (!try)
{
+#ifdef ENABLE_NLS
+ if (orig_codeset)
+ bind_textdomain_codeset (PACKAGE, orig_codeset);
+#endif /*ENABLE_NLS*/
log_error (_("gpg-agent is not available in this session\n"));
opt.use_agent = 0;
}
@@ -307,6 +313,10 @@ agent_open (int try)
{
if (!try)
{
+#ifdef ENABLE_NLS
+ if (orig_codeset)
+ bind_textdomain_codeset (PACKAGE, orig_codeset);
+#endif /*ENABLE_NLS*/
log_error ( _("malformed GPG_AGENT_INFO environment variable\n"));
opt.use_agent = 0;
}
@@ -322,6 +332,10 @@ agent_open (int try)
{
if (!try)
{
+#ifdef ENABLE_NLS
+ if (orig_codeset)
+ bind_textdomain_codeset (PACKAGE, orig_codeset);
+#endif /*ENABLE_NLS*/
log_error (_("gpg-agent protocol version %d is not supported\n"),
prot);
opt.use_agent = 0;
@@ -335,6 +349,10 @@ agent_open (int try)
{
if (!try)
{
+#ifdef ENABLE_NLS
+ if (orig_codeset)
+ bind_textdomain_codeset (PACKAGE, orig_codeset);
+#endif /*ENABLE_NLS*/
log_error ( _("can't connect to `%s': %s\n"),
infostr, assuan_strerror (rc));
opt.use_agent = 0;
@@ -348,6 +366,10 @@ agent_open (int try)
{
if (!try)
{
+#ifdef ENABLE_NLS
+ if (orig_codeset)
+ bind_textdomain_codeset (PACKAGE, orig_codeset);
+#endif /*ENABLE_NLS*/
log_error (_("problem with the agent - disabling agent use\n"));
opt.use_agent = 0;
}
@@ -485,7 +507,7 @@ agent_get_passphrase ( u32 *keyid, int mode, const char *cacheid,
}
#endif
- if ( !(ctx = agent_open (0)) )
+ if ( !(ctx = agent_open (0, orig_codeset)) )
goto failure;
if (custom_description)
@@ -633,7 +655,10 @@ agent_get_passphrase ( u32 *keyid, int mode, const char *cacheid,
failure:
#ifdef ENABLE_NLS
if (orig_codeset)
- bind_textdomain_codeset (PACKAGE, orig_codeset);
+ {
+ bind_textdomain_codeset (PACKAGE, orig_codeset);
+ xfree (orig_codeset);
+ }
#endif
xfree (atext);
agent_close (ctx);
@@ -683,7 +708,7 @@ passphrase_clear_cache ( u32 *keyid, const char *cacheid, int algo )
else
pk = NULL;
- if ( !(ctx = agent_open (0)) )
+ if ( !(ctx = agent_open (0, NULL)) )
goto failure;
{