summaryrefslogtreecommitdiff
path: root/p11-kit/util.c
diff options
context:
space:
mode:
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;
}