summaryrefslogtreecommitdiff
path: root/p11-kit/util.c
diff options
context:
space:
mode:
authorStef Walter <stefw@gnome.org>2012-12-06 22:42:02 +0100
committerStef Walter <stefw@gnome.org>2013-01-09 13:49:44 +0100
commit3d503948450d69293a3fdfec096e398fedf714f2 (patch)
tree17b68364a71602b846c5122c8007b86fd51812c2 /p11-kit/util.c
parentc343f355b6abfe65adc696b57b18dc57c834acbc (diff)
downloadp11-kit-3d503948450d69293a3fdfec096e398fedf714f2.tar.gz
Move debug and library code into the common/ subdirectory
Start using p11_ as our internal prefix rather than _p11_. We explicitly export p11_kit_ so this is fine as far as visibility. Move the threading, mutex, and module compat, dict, and array code into the common directory too. Take this opportunity to clean up a bit of internal API as well, since so many lines are being touched internally.
Diffstat (limited to 'p11-kit/util.c')
-rw-r--r--p11-kit/util.c318
1 files changed, 19 insertions, 299 deletions
diff --git a/p11-kit/util.c b/p11-kit/util.c
index ccc954c..9c5d99b 100644
--- a/p11-kit/util.c
+++ b/p11-kit/util.c
@@ -38,11 +38,11 @@
#include "config.h"
#include "compat.h"
-#define DEBUG_FLAG DEBUG_LIB
+#define P11_DEBUG_FLAG P11_DEBUG_LIB
#include "debug.h"
+#include "library.h"
#include "p11-kit.h"
#include "private.h"
-#include "util.h"
#include <assert.h>
#include <stdarg.h>
@@ -50,18 +50,6 @@
#include <stdio.h>
#include <string.h>
-/*
- * This is the mutex that protects the global data of this library
- * and the pkcs11 proxy module. Note that we *never* call into our
- * underlying pkcs11 modules while holding this mutex. Therefore it
- * doesn't have to be recursive and we can keep things simple.
- */
-mutex_t _p11_mutex;
-
-#ifdef OS_UNIX
-pthread_once_t _p11_once;
-#endif
-
/**
* SECTION:p11-kit-future
* @title: Future
@@ -72,8 +60,6 @@ pthread_once_t _p11_once;
* MACRO. See the p11-kit.h header for more details.
*/
-static int print_messages = 1;
-
/**
* p11_kit_space_strlen:
* @string: Pointer to string block
@@ -146,45 +132,6 @@ p11_kit_space_strdup (const unsigned char *string, size_t max_length)
return result;
}
-static void
-store_message_buffer (const char* msg, size_t length)
-{
- p11_local *local;
-
- if (length > P11_MAX_MESSAGE - 1)
- length = P11_MAX_MESSAGE - 1;
-
- local = _p11_library_get_thread_local ();
- if (local != NULL) {
- memcpy (local->message, msg, length);
- local->message[length] = 0;
- }
-}
-
-void
-_p11_message (const char* msg, ...)
-{
- char buffer[P11_MAX_MESSAGE];
- va_list va;
- size_t length;
-
- va_start (va, msg);
- length = vsnprintf (buffer, P11_MAX_MESSAGE - 1, msg, va);
- va_end (va);
-
- /* Was it truncated? */
- if (length > P11_MAX_MESSAGE - 1)
- length = P11_MAX_MESSAGE - 1;
- buffer[length] = 0;
-
- /* If printing is not disabled, just print out */
- if (print_messages)
- fprintf (stderr, "p11-kit: %s\n", buffer);
-
- _p11_debug_message (DEBUG_LIB, "message: %s", buffer);
- store_message_buffer (buffer, length);
-}
-
/**
* p11_kit_be_quiet:
*
@@ -194,9 +141,7 @@ _p11_message (const char* msg, ...)
void
p11_kit_be_quiet (void)
{
- _p11_lock ();
- print_messages = 0;
- _p11_unlock ();
+ p11_message_quiet ();
}
/**
@@ -215,18 +160,7 @@ p11_kit_be_quiet (void)
const char*
p11_kit_message (void)
{
- p11_local *local;
- local = _p11_library_get_thread_local ();
- return local && local->message[0] ? local->message : NULL;
-}
-
-void
-_p11_kit_clear_message (void)
-{
- p11_local *local;
- local = _p11_library_get_thread_local ();
- if (local != NULL)
- local->message[0] = 0;
+ return p11_message_last ();
}
void
@@ -236,231 +170,12 @@ _p11_kit_default_message (CK_RV rv)
if (rv != CKR_OK) {
msg = p11_kit_strerror (rv);
- store_message_buffer (msg, strlen (msg));
+ p11_message_store (msg, strlen (msg));
}
}
-static void
-uninit_common (void)
-{
- _p11_debug ("uninitializing library");
-
- _p11_set_progname_unlocked (NULL);
-}
-
-#ifdef OS_UNIX
-
-static pthread_key_t thread_local = 0;
-
-p11_local *
-_p11_library_get_thread_local (void)
-{
- p11_local *local;
-
- _p11_library_init_once ();
-
- local = pthread_getspecific (thread_local);
- if (local == NULL) {
- local = calloc (1, sizeof (p11_local));
- pthread_setspecific (thread_local, local);
- }
-
- return local;
-}
-
-#ifdef __GNUC__
-__attribute__((constructor))
-#endif
-void
-_p11_library_init (void)
-{
- _p11_debug_init ();
- _p11_debug ("initializing library");
- _p11_mutex_init (&_p11_mutex);
- pthread_key_create (&thread_local, free);
-}
-
-#ifdef __GNUC__
-__attribute__((destructor))
-#endif
-void
-_p11_library_uninit (void)
-{
- uninit_common ();
-
- /* Some cleanup to pacify valgrind */
- free (pthread_getspecific (thread_local));
- pthread_setspecific (thread_local, NULL);
-
- pthread_key_delete (thread_local);
- _p11_mutex_uninit (&_p11_mutex);
-}
-
-void
-_p11_mutex_init (mutex_t *mutex)
-{
- pthread_mutexattr_t attr;
- int ret;
-
- pthread_mutexattr_init (&attr);
- pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE);
- ret = pthread_mutex_init (mutex, &attr);
- assert (ret == 0);
- pthread_mutexattr_destroy (&attr);
-}
-
-#endif /* OS_UNIX */
-
-#ifdef OS_WIN32
-
-static DWORD thread_local = TLS_OUT_OF_INDEXES;
-
-BOOL WINAPI DllMain (HINSTANCE, DWORD, LPVOID);
-
-p11_local *
-_p11_library_get_thread_local (void)
-{
- LPVOID data;
-
- if (thread_local == TLS_OUT_OF_INDEXES)
- return NULL;
-
- data = TlsGetValue (thread_local);
- if (data == NULL) {
- data = LocalAlloc (LPTR, sizeof (p11_local));
- TlsSetValue (thread_local, data);
- }
-
- return (p11_local *)data;
-}
-
-void
-_p11_library_init (void)
-{
- _p11_debug_init ();
- _p11_debug ("initializing library");
- _p11_mutex_init (&_p11_mutex);
- thread_local = TlsAlloc ();
-}
-
-static void
-free_tls_value (LPVOID data)
-{
- p11_local *local = data;
- if (local == NULL)
- return;
- if (local->last_error)
- LocalFree (local->last_error);
- LocalFree (data);
-}
-
-void
-_p11_library_uninit (void)
-{
- LPVOID data;
-
- uninit_common ();
-
- if (thread_local != TLS_OUT_OF_INDEXES) {
- data = TlsGetValue (thread_local);
- free_tls_value (data);
- TlsFree (thread_local);
- }
- _p11_mutex_uninit (&_p11_mutex);
-}
-
-const char *
-_p11_module_error (void)
-{
- DWORD code = GetLastError();
- p11_local *local;
- LPVOID msg_buf;
-
- local = _p11_library_get_thread_local ();
-
- FormatMessageA (FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, code,
- MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPSTR)&msg_buf, 0, NULL);
-
- if (local->last_error)
- LocalFree (local->last_error);
- local->last_error = msg_buf;
-
- return msg_buf;
-}
-
-int
-_p11_thread_create (thread_t *thread,
- thread_routine routine,
- void *arg)
-{
- assert (thread);
-
- *thread = CreateThread (NULL, 0,
- (LPTHREAD_START_ROUTINE)routine,
- arg, 0, NULL);
-
- if (*thread == NULL)
- return GetLastError ();
-
- return 0;
-}
-
-int
-_p11_thread_join (thread_t thread)
-{
- DWORD res;
-
- res = WaitForSingleObject (thread, INFINITE);
- if (res == WAIT_FAILED)
- return GetLastError ();
-
- CloseHandle (thread);
- return 0;
-}
-
-BOOL WINAPI
-DllMain (HINSTANCE instance,
- DWORD reason,
- LPVOID reserved)
-{
- LPVOID data;
-
- switch (reason) {
- case DLL_PROCESS_ATTACH:
- _p11_library_init ();
- if (thread_local == TLS_OUT_OF_INDEXES) {
- _p11_debug ("couldn't setup tls");
- return FALSE;
- }
- break;
-
- case DLL_THREAD_DETACH:
- if (thread_local != TLS_OUT_OF_INDEXES) {
- _p11_debug ("thread stopped, freeing tls");
- data = TlsGetValue (thread_local);
- free_tls_value (data);
- }
- break;
-
- case DLL_PROCESS_DETACH:
- _p11_library_uninit ();
- break;
-
- default:
- break;
- }
-
- return TRUE;
-}
-
-#endif /* OS_WIN32 */
-
/* This is the progname that we think of this process as. */
-char *_p11_my_progname = NULL;
+char p11_my_progname[256] = { 0, };
/**
* p11_kit_set_progname:
@@ -475,25 +190,30 @@ char *_p11_my_progname = NULL;
void
p11_kit_set_progname (const char *progname)
{
- _p11_library_init_once ();
+ p11_library_init_once ();
- _p11_lock ();
+ p11_lock ();
_p11_set_progname_unlocked (progname);
- _p11_unlock ();
+ p11_unlock ();
}
void
_p11_set_progname_unlocked (const char *progname)
{
- /* We can be called with NULL, to cleanup memory usage */
- free (_p11_my_progname);
- _p11_my_progname = progname ? strdup (progname) : NULL;
+ /* We can be called with NULL */
+ if (progname == NULL)
+ progname = "";
+
+ strncpy (p11_my_progname, progname, sizeof (p11_my_progname));
+ p11_my_progname[sizeof (p11_my_progname) - 1] = 0;
}
const char *
_p11_get_progname_unlocked (void)
{
- if (_p11_my_progname == NULL)
+ if (p11_my_progname[0] == '\0')
_p11_set_progname_unlocked (getprogname ());
- return _p11_my_progname;
+ if (p11_my_progname[0] == '\0')
+ return NULL;
+ return p11_my_progname;
}