diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | configure.ac | 23 | ||||
-rw-r--r-- | doc/Makefile.am | 2 | ||||
-rw-r--r-- | p11-kit/Makefile.am | 1 | ||||
-rw-r--r-- | p11-kit/conf.c | 7 | ||||
-rw-r--r-- | p11-kit/debug.c | 136 | ||||
-rw-r--r-- | p11-kit/debug.h | 93 | ||||
-rw-r--r-- | p11-kit/p11-kit-lib.c | 17 |
8 files changed, 272 insertions, 8 deletions
@@ -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; } |