]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
Use locking, prefer our mutex abstraction layer
authorMartin Willi <martin@revosec.ch>
Wed, 14 Jul 2010 08:39:28 +0000 (10:39 +0200)
committerMartin Willi <martin@revosec.ch>
Wed, 4 Aug 2010 07:26:19 +0000 (09:26 +0200)
src/libstrongswan/plugins/pkcs11/pkcs11_library.c

index 481bb062b97a103f0d0c1ba1f7f6f81a682c8ce0..6701494e17813aad742ea2178b92408621be05b8 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <library.h>
 #include <debug.h>
+#include <threading/mutex.h>
 
 typedef struct private_pkcs11_library_t private_pkcs11_library_t;
 
@@ -213,6 +214,48 @@ static void trim(char *str, int len)
        }
 }
 
+/**
+ * Mutex creation callback
+ */
+static CK_RV CreateMutex(CK_VOID_PTR_PTR data)
+{
+       *data = mutex_create(MUTEX_TYPE_DEFAULT);
+       return CKR_OK;
+}
+
+/**
+ * Mutex destruction callback
+ */
+static CK_RV DestroyMutex(CK_VOID_PTR data)
+{
+       mutex_t *mutex = (mutex_t*)data;
+
+       mutex->destroy(mutex);
+       return CKR_OK;
+}
+
+/**
+ * Mutex lock callback
+ */
+static CK_RV LockMutex(CK_VOID_PTR data)
+{
+       mutex_t *mutex = (mutex_t*)data;
+
+       mutex->lock(mutex);
+       return CKR_OK;
+}
+
+/**
+ * Mutex unlock callback
+ */
+static CK_RV UnlockMutex(CK_VOID_PTR data)
+{
+       mutex_t *mutex = (mutex_t*)data;
+
+       mutex->unlock(mutex);
+       return CKR_OK;
+}
+
 /**
  * Initialize a PKCS#11 library
  */
@@ -221,6 +264,12 @@ static bool initialize(private_pkcs11_library_t *this, char *name, char *file)
        CK_C_GetFunctionList pC_GetFunctionList;
        CK_INFO info;
        CK_RV rv;
+       CK_C_INITIALIZE_ARGS args = {
+               .CreateMutex = CreateMutex,
+               .DestroyMutex = DestroyMutex,
+               .LockMutex = LockMutex,
+               .UnlockMutex = UnlockMutex,
+       };
 
        pC_GetFunctionList = dlsym(this->handle, "C_GetFunctionList");
        if (!pC_GetFunctionList)
@@ -236,7 +285,13 @@ static bool initialize(private_pkcs11_library_t *this, char *name, char *file)
                return FALSE;
        }
 
-       rv = this->public.f->C_Initialize(NULL);
+       rv = this->public.f->C_Initialize(&args);
+       if (rv == CKR_CANT_LOCK)
+       {       /* try OS locking */
+               memset(&args, 0, sizeof(args));
+               args.flags = CKF_OS_LOCKING_OK;
+               rv = this->public.f->C_Initialize(&args);
+       }
        if (rv != CKR_OK)
        {
                DBG1(DBG_CFG, "C_Initialize() error for '%s': %N",
@@ -263,6 +318,10 @@ static bool initialize(private_pkcs11_library_t *this, char *name, char *file)
                 sizeof(info.manufacturerID), info.manufacturerID,
                 sizeof(info.libraryDescription), info.libraryDescription,
                 info.libraryVersion.major, info.libraryVersion.minor);
+       if (args.flags & CKF_OS_LOCKING_OK)
+       {
+               DBG1(DBG_CFG, "  uses OS locking functions");
+       }
        return TRUE;
 }