*.o
*.la
*.lo
+*.bak
*.tar.gz
*.gcno
*.gcda
# 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
# 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
MODULE_SRCS = \
conf.c conf.h \
+ debug.c debug.h \
hash.c hash.h \
util.c util.h \
p11-kit-lib.c \
#include "config.h"
#include "conf.h"
+#define DEBUG_FLAG DEBUG_CONF
+#include "debug.h"
#include <sys/param.h>
#include <sys/stat.h>
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)
errno = ENOMEM;
break;
}
+
+ debug ("config value: %s = %s", name, value);
+
if (!hash_set (ht, name, value)) {
free (name);
free (value);
--- /dev/null
+/*
+ * 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);
+}
--- /dev/null
+/*
+ * 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) */
#include "config.h"
#include "conf.h"
+#define DEBUG_FLAG DEBUG_LIB
+#include "debug.h"
#include "hash.h"
#include "pkcs11.h"
#include "p11-kit.h"
Module *module;
/* WARNING: This function must be reentrant */
+ debug ("forked");
_p11_lock ();
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;
}
CK_RV rv;
/* WARNING: This function must be reentrant */
+ debug ("in");
_p11_lock ();
if (rv != CKR_OK)
p11_kit_finalize_registered ();
+ debug ("out: %lu");
return rv;
}
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]);
CK_RV rv;
/* WARNING: This function must be reentrant */
+ debug ("in");
_p11_lock ();
_p11_unlock ();
+ debug ("out: %lu", rv);
return rv;
}
CK_RV rv = CKR_OK;
/* WARNING: This function must be reentrant for the same arguments */
+ debug ("in");
_p11_lock ();
module = hash_get (gl.modules, funcs);
if (module == NULL) {
+ debug ("allocating new module");
allocated = module = alloc_module_unlocked ();
module->funcs = funcs;
}
_p11_unlock ();
+ debug ("out: %lu", rv);
return rv;
}
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 */
_p11_unlock ();
+ debug ("out: %lu", rv);
return rv;
}