aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/debug.c42
-rw-r--r--src/debug.h3
-rw-r--r--src/gpgme.c21
-rw-r--r--src/gpgme.def2
-rw-r--r--src/gpgme.h.in3
-rw-r--r--src/libgpgme.vers4
6 files changed, 66 insertions, 9 deletions
diff --git a/src/debug.c b/src/debug.c
index 8e293b4e..56effa75 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -60,6 +60,12 @@ static int debug_level;
/* The output stream for the debug messages. */
static FILE *errfp;
+/* If not NULL, this malloced string is used instead of the
+ GPGME_DEBUG envvar. It must have been set before the debug
+ subsystem has been initialized. Using it later may or may not have
+ any effect. */
+static char *envvar_override;
+
#ifdef HAVE_TLS
#define FRAME_NR
@@ -109,6 +115,19 @@ trim_spaces (char *str)
}
+/* This is an internal function to set debug info. The caller must
+ assure that this function is called only by one thread at a time.
+ The function may have no effect if called after the debug system
+ has been initialized. Returns 0 on success. */
+int
+_gpgme_debug_set_debug_envvar (const char *value)
+{
+ free (envvar_override);
+ envvar_override = strdup (value);
+ return !envvar_override;
+}
+
+
static void
debug_init (void)
{
@@ -121,16 +140,25 @@ debug_init (void)
char *e;
const char *s1, *s2;;
+ if (envvar_override)
+ {
+ e = strdup (envvar_override);
+ free (envvar_override);
+ envvar_override = NULL;
+ }
+ else
+ {
#ifdef HAVE_W32CE_SYSTEM
- e = _gpgme_w32ce_get_debug_envvar ();
+ e = _gpgme_w32ce_get_debug_envvar ();
#else /*!HAVE_W32CE_SYSTEM*/
- err = _gpgme_getenv ("GPGME_DEBUG", &e);
- if (err)
- {
- UNLOCK (debug_lock);
- return;
- }
+ err = _gpgme_getenv ("GPGME_DEBUG", &e);
+ if (err)
+ {
+ UNLOCK (debug_lock);
+ return;
+ }
#endif /*!HAVE_W32CE_SYSTEM*/
+ }
initialized = 1;
errfp = stderr;
diff --git a/src/debug.h b/src/debug.h
index 7bd9ed78..ead92b24 100644
--- a/src/debug.h
+++ b/src/debug.h
@@ -54,6 +54,9 @@ _gpgme_debug_srcname (const char *file)
return s? s+1:file;
}
+/* Initialization helper function; see debug.c. */
+int _gpgme_debug_set_debug_envvar (const char *value);
+
/* Called early to initialize the logging. */
void _gpgme_debug_subsystem_init (void);
diff --git a/src/gpgme.c b/src/gpgme.c
index 771fcc00..2c6ac875 100644
--- a/src/gpgme.c
+++ b/src/gpgme.c
@@ -1,6 +1,6 @@
/* gpgme.c - GnuPG Made Easy.
Copyright (C) 2000 Werner Koch (dd9jn)
- Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007 g10 Code GmbH
+ Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2012 g10 Code GmbH
This file is part of GPGME.
@@ -52,6 +52,25 @@ gpgme_error_t _gpgme_selftest = GPG_ERR_NOT_OPERATIONAL;
DEFINE_STATIC_LOCK (result_ref_lock);
+/* Set the global flag NAME to VALUE. Return 0 on success. Note that
+ this function does use gpgme_error and thus a non-zero return value
+ merely means "error". Certain flags may be set before
+ gpgme_check_version is called. See the manual for a description of
+ supported flags. The caller must assure that this function is
+ called only by one thread at a time. */
+int
+gpgme_set_global_flag (const char *name, const char *value)
+{
+ if (!name || !value)
+ return -1;
+ else if (!strcmp (name, "debug"))
+ return _gpgme_debug_set_debug_envvar (value);
+ else
+ return -1;
+}
+
+
+
/* Create a new context as an environment for GPGME crypto
operations. */
gpgme_error_t
diff --git a/src/gpgme.def b/src/gpgme.def
index 9990b334..56a64280 100644
--- a/src/gpgme.def
+++ b/src/gpgme.def
@@ -202,5 +202,7 @@ EXPORTS
gpgme_err_code_from_syserror @154
gpgme_err_set_errno @155
+ gpgme_set_global_flag @156
+
; END
diff --git a/src/gpgme.h.in b/src/gpgme.h.in
index 7263d983..ce469dee 100644
--- a/src/gpgme.h.in
+++ b/src/gpgme.h.in
@@ -2026,6 +2026,9 @@ gpgme_error_t gpgme_key_from_uid (gpgme_key_t *key, const char *name);
/* Various functions. */
+/* Set special global flags; consult the manual before use. */
+int gpgme_set_global_flag (const char *name, const char *value);
+
/* Check that the library fulfills the version requirement. Note:
This is here only for the case where a user takes a pointer from
the old version of this function. The new version and macro for
diff --git a/src/libgpgme.vers b/src/libgpgme.vers
index 3477d318..d59571e1 100644
--- a/src/libgpgme.vers
+++ b/src/libgpgme.vers
@@ -1,5 +1,5 @@
# libgpgme.vers - List of symbols to export.
-# Copyright (C) 2002, 2004, 2005, 2009 g10 Code GmbH
+# Copyright (C) 2002, 2004, 2005, 2009, 2012 g10 Code GmbH
#
# This file is part of GPGME.
#
@@ -79,6 +79,8 @@ GPGME_1.1 {
gpgme_op_passwd_start;
gpgme_op_passwd;
+
+ gpgme_set_global_flag;
};