summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--configure.ac23
-rw-r--r--doc/Makefile.am2
-rw-r--r--p11-kit/Makefile.am1
-rw-r--r--p11-kit/conf.c7
-rw-r--r--p11-kit/debug.c136
-rw-r--r--p11-kit/debug.h93
-rw-r--r--p11-kit/p11-kit-lib.c17
8 files changed, 272 insertions, 8 deletions
diff --git a/.gitignore b/.gitignore
index f2047de..2a16de9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
*.o
*.la
*.lo
+*.bak
*.tar.gz
*.gcno
*.gcda
diff --git a/configure.ac b/configure.ac
index a10790b..2892c70 100644
--- a/configure.ac
+++ b/configure.ac
@@ -124,15 +124,26 @@ AC_SUBST(GENHTML)
# Debug mode
AC_ARG_ENABLE(debug,
- AC_HELP_STRING([--enable-debug],
- [Compile binaries in debug mode]))
+ AC_HELP_STRING([--enable-debug=no/yes/full],
+ [Turn on or off debugging]))
-if test "$enable_debug" = "yes"; then
- CFLAGS="$CFLAGS -g -O0"
- AC_DEFINE_UNQUOTED(_DEBUG, 1, [In debug mode])
- echo "enabling debug compile mode"
+if test "$enable_debug" != "no"; then
+ AC_DEFINE_UNQUOTED(WITH_DEBUG, 1, [Print debug output])
fi
+if test "$enable_debug" = "full"; then
+ debug_status="full"
+ CFLAGS="$CFLAGS -g -O0 -Werror"
+
+elif test "$enable_debug" = "no"; then
+ debug_status="no"
+ AC_DEFINE_UNQUOTED(NDEBUG, 1, [Disable glib assertions])
+
+else
+ debug_status="yes"
+fi
+
+
# ---------------------------------------------------------------------
AC_CONFIG_FILES([Makefile
diff --git a/doc/Makefile.am b/doc/Makefile.am
index fe65836..4672b20 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -42,7 +42,7 @@ CFILE_GLOB=$(top_srcdir)/p11-kit/p11-kit-*.c
# Header files to ignore when scanning.
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
-IGNORE_HFILES= p11-kit-private.h pkcs11.h hash.h conf.h util.h
+IGNORE_HFILES= p11-kit-private.h pkcs11.h conf.h debug.h hash.h util.h
# Images to copy into HTML directory.
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
diff --git a/p11-kit/Makefile.am b/p11-kit/Makefile.am
index a5a9195..0b7e163 100644
--- a/p11-kit/Makefile.am
+++ b/p11-kit/Makefile.am
@@ -11,6 +11,7 @@ inc_HEADERS = \
MODULE_SRCS = \
conf.c conf.h \
+ debug.c debug.h \
hash.c hash.h \
util.c util.h \
p11-kit-lib.c \
diff --git a/p11-kit/conf.c b/p11-kit/conf.c
index de42745..7523f98 100644
--- a/p11-kit/conf.c
+++ b/p11-kit/conf.c
@@ -38,6 +38,8 @@
#include "config.h"
#include "conf.h"
+#define DEBUG_FLAG DEBUG_CONF
+#include "debug.h"
#include <sys/param.h>
#include <sys/stat.h>
@@ -182,6 +184,8 @@ conf_parse_file (const char* filename, int flags,
assert (filename);
+ debug ("reading config file: %s", filename);
+
/* Adds an extra newline to end of file */
config = read_config_file (filename, flags, error_func);
if (!config)
@@ -226,6 +230,9 @@ conf_parse_file (const char* filename, int flags,
errno = ENOMEM;
break;
}
+
+ debug ("config value: %s = %s", name, value);
+
if (!hash_set (ht, name, value)) {
free (name);
free (value);
diff --git a/p11-kit/debug.c b/p11-kit/debug.c
new file mode 100644
index 0000000..a7b75ad
--- /dev/null
+++ b/p11-kit/debug.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2011 Collabora Ltd.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the
+ * above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ * * The names of contributors to this software may not be
+ * used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ *
+ * CONTRIBUTORS
+ * Stef Walter <stef@memberwebs.com>
+ */
+
+#include "config.h"
+
+#include "debug.h"
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+struct DebugKey {
+ const char *name;
+ int value;
+};
+
+static struct DebugKey debug_keys[] = {
+ { "lib", DEBUG_LIB },
+ { "conf", DEBUG_CONF },
+ { 0, }
+};
+
+pthread_mutex_t debug_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/* global variable exported in debug.h */
+int debug_current_flags = ~0;
+
+static int
+parse_environ_flags (void)
+{
+ const char *env;
+ int result = 0;
+ const char *p;
+ const char *q;
+ int i;
+
+ env = getenv ("P11_KIT_DEBUG");
+ if (!env)
+ return 0;
+
+ if (strcmp (env, "all") == 0) {
+ for (i = 0; debug_keys[i].name; i++)
+ result |= debug_keys[i].value;
+
+ } else if (strcmp (env, "help") == 0) {
+ fprintf (stderr, "Supported debug values:");
+ for (i = 0; debug_keys[i].name; i++)
+ fprintf (stderr, " %s", debug_keys[i].name);
+ fprintf (stderr, "\n");
+
+ } else {
+ p = env;
+ while (*p) {
+ q = strpbrk (p, ":;, \t");
+ if (!q)
+ q = p + strlen (p);
+
+ for (i = 0; debug_keys[i].name; i++) {
+ if (q - p == strlen (debug_keys[i].name) &&
+ strncmp (debug_keys[i].name, p, q - p) == 0)
+ result |= debug_keys[i].value;
+ }
+
+ p = q;
+ if (*p)
+ p++;
+ }
+ }
+
+ return result;
+}
+
+void
+debug_message (int flag, const char *format, ...)
+{
+ static int initialized_flags = 0;
+ char buffer[512];
+ va_list args;
+
+ pthread_mutex_lock (&debug_mutex);
+
+ /*
+ * This is not thread-safe, but it's not really the end of the
+ * world if it happens more than once.
+ */
+ if (!initialized_flags) {
+ initialized_flags = 1;
+ debug_current_flags = parse_environ_flags ();
+ }
+
+ if (flag & debug_current_flags) {
+ va_start (args, format);
+ vsnprintf (buffer, sizeof (buffer), format, args);
+ buffer[sizeof (buffer) -1] = 0;
+ va_end (args);
+ fprintf (stderr, "(p11-kit:%d) %s\n", getpid(), buffer);
+ }
+
+ pthread_mutex_unlock (&debug_mutex);
+}
diff --git a/p11-kit/debug.h b/p11-kit/debug.h
new file mode 100644
index 0000000..5d244f3
--- /dev/null
+++ b/p11-kit/debug.h
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2011 Collabora Ltd.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the
+ * above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ * * The names of contributors to this software may not be
+ * used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * Author: Stef Walter <stefw@collabora.co.uk>
+ */
+
+#ifndef DEBUG_H
+#define DEBUG_H
+
+/* Please keep this enum in sync with keys in debug.c */
+typedef enum {
+ DEBUG_LIB = 1 << 1,
+ DEBUG_CONF = 1 << 2
+} DebugFlags;
+
+extern int debug_current_flags;
+
+void debug_message (int flag,
+ const char *format,
+ ...);
+
+#endif /* DEBUG_H */
+
+/* -----------------------------------------------------------------------------
+ * Below this point is outside the DEBUG_H guard - so it can take effect
+ * more than once. So you can do:
+ *
+ * #define DEBUG_FLAG DEBUG_ONE_THING
+ * #include "gkr-debug.h"
+ * ...
+ * DEBUG ("if we're debugging one thing");
+ * ...
+ * #undef DEBUG_FLAG
+ * #define DEBUG_FLAG DEBUG_OTHER_THING
+ * #include "gkr-debug.h"
+ * ...
+ * DEBUG ("if we're debugging the other thing");
+ * ...
+ */
+
+#ifdef DEBUG_FLAG
+#ifdef WITH_DEBUG
+
+#undef debug
+#define debug(format, ...) do { \
+ if (DEBUG_FLAG & debug_current_flags) \
+ debug_message (DEBUG_FLAG, "%s: " format, __PRETTY_FUNCTION__, ##__VA_ARGS__); \
+ } while (0)
+
+#undef debugging
+#define debugging \
+ (DEBUG_FLAG & debug_current_flags)
+
+#else /* !defined (WITH_DEBUG) */
+
+#undef debug
+#define debug(format, ...) \
+ do {} while (0)
+
+#undef debugging
+#define debugging 0
+
+#endif /* !defined (WITH_DEBUG) */
+
+#endif /* defined (DEBUG_FLAG) */
diff --git a/p11-kit/p11-kit-lib.c b/p11-kit/p11-kit-lib.c
index 7bd70e3..561df47 100644
--- a/p11-kit/p11-kit-lib.c
+++ b/p11-kit/p11-kit-lib.c
@@ -36,6 +36,8 @@
#include "config.h"
#include "conf.h"
+#define DEBUG_FLAG DEBUG_LIB
+#include "debug.h"
#include "hash.h"
#include "pkcs11.h"
#include "p11-kit.h"
@@ -633,6 +635,7 @@ reinitialize_after_fork (void)
Module *module;
/* WARNING: This function must be reentrant */
+ debug ("forked");
_p11_lock ();
@@ -742,7 +745,7 @@ find_module_for_name_unlocked (const char *name)
hash_iterate (gl.modules, &it);
while (hash_next (&it, NULL, (void**)&module))
- if (module->ref_count && module->name && strcmp (name, module->name))
+ if (module->ref_count && module->name && strcmp (name, module->name) == 0)
return module;
return NULL;
}
@@ -795,6 +798,7 @@ p11_kit_initialize_registered (void)
CK_RV rv;
/* WARNING: This function must be reentrant */
+ debug ("in");
_p11_lock ();
@@ -807,6 +811,7 @@ p11_kit_initialize_registered (void)
if (rv != CKR_OK)
p11_kit_finalize_registered ();
+ debug ("out: %lu");
return rv;
}
@@ -836,6 +841,8 @@ _p11_kit_finalize_registered_unlocked_reentrant (void)
to_finalize[count++] = module;
}
+ debug ("finalizing %d modules", count);
+
for (i = 0; i < count; ++i) {
/* WARNING: Reentrant calls can occur here */
finalize_module_unlocked_reentrant (to_finalize[i]);
@@ -864,6 +871,7 @@ p11_kit_finalize_registered (void)
CK_RV rv;
/* WARNING: This function must be reentrant */
+ debug ("in");
_p11_lock ();
@@ -872,6 +880,7 @@ p11_kit_finalize_registered (void)
_p11_unlock ();
+ debug ("out: %lu", rv);
return rv;
}
@@ -1063,6 +1072,7 @@ p11_kit_initialize_module (CK_FUNCTION_LIST_PTR funcs)
CK_RV rv = CKR_OK;
/* WARNING: This function must be reentrant for the same arguments */
+ debug ("in");
_p11_lock ();
@@ -1071,6 +1081,7 @@ p11_kit_initialize_module (CK_FUNCTION_LIST_PTR funcs)
module = hash_get (gl.modules, funcs);
if (module == NULL) {
+ debug ("allocating new module");
allocated = module = alloc_module_unlocked ();
module->funcs = funcs;
}
@@ -1089,6 +1100,7 @@ p11_kit_initialize_module (CK_FUNCTION_LIST_PTR funcs)
_p11_unlock ();
+ debug ("out: %lu", rv);
return rv;
}
@@ -1120,11 +1132,13 @@ p11_kit_finalize_module (CK_FUNCTION_LIST_PTR funcs)
CK_RV rv = CKR_OK;
/* WARNING: This function must be reentrant for the same arguments */
+ debug ("in");
_p11_lock ();
module = gl.modules ? hash_get (gl.modules, funcs) : NULL;
if (module == NULL) {
+ debug ("module not found");
rv = CKR_ARGUMENTS_BAD;
} else {
/* WARNING: Rentrancy can occur here */
@@ -1133,5 +1147,6 @@ p11_kit_finalize_module (CK_FUNCTION_LIST_PTR funcs)
_p11_unlock ();
+ debug ("out: %lu", rv);
return rv;
}