diff options
Diffstat (limited to 'p11-kit/rpc-client.c')
-rw-r--r-- | p11-kit/rpc-client.c | 65 |
1 files changed, 26 insertions, 39 deletions
diff --git a/p11-kit/rpc-client.c b/p11-kit/rpc-client.c index 5292d89..d2b28a2 100644 --- a/p11-kit/rpc-client.c +++ b/p11-kit/rpc-client.c @@ -30,12 +30,11 @@ #include "rpc-client.h" #include "rpc-mechanism.h" #include "rpc-message.h" -#include "rpc-socket.h" -#include "unix-credentials.h" #include <assert.h> #include <pthread.h> #include <string.h> +#include <unistd.h> /* The error used by us when parsing of rpc message fails */ #define PARSE_ERROR CKR_DEVICE_ERROR @@ -47,8 +46,7 @@ typedef struct { int check; CK_FUNCTION_LIST_PTR function_list; pthread_mutex_t mutex; - const RpcClientVtable *vtable; - RpcSocket *socket; + RpcClientVtable *vtable; pid_t initialized_pid; } RpcModule; @@ -56,9 +54,9 @@ typedef struct { { id, (CK_FUNCTION_LIST_PTR)function_list, PTHREAD_MUTEX_INITIALIZER, NULL, 0 } /* Allocator for call session buffers */ -static void* -call_allocator (void *pointer, - size_t size) +static void * +log_allocator (void *pointer, + size_t size) { void *result = realloc (pointer, (size_t)size); if (!result && size) @@ -74,14 +72,10 @@ call_prepare (RpcModule *module, assert (module != NULL); assert (msg != NULL); - if (!module->socket) + if (module->initialized_pid == 0) return CKR_CRYPTOKI_NOT_INITIALIZED; - if (!_p11_rpc_socket_is_open (module->socket)) - return CKR_DEVICE_REMOVED; - - _p11_rpc_socket_ref (module->socket); - _p11_rpc_message_init (msg, call_allocator); + _p11_rpc_message_init (msg, log_allocator); /* Put in the Call ID and signature */ if (!_p11_rpc_message_prep (msg, call_id, RPC_REQUEST)) @@ -97,6 +91,9 @@ call_run (RpcModule *module, { CK_RV ret = CKR_OK; CK_ULONG ckerr; + unsigned char *data; + size_t n_data; + int call_id; assert (module != NULL); @@ -112,8 +109,12 @@ call_run (RpcModule *module, assert (_p11_rpc_message_is_verified (msg)); call_id = msg->call_id; - /* Do the dialog with daemon */ - ret = _p11_rpc_socket_send_recv (module->socket, msg); + /* Do the transport send and receive */ + assert (module->vtable->transport != NULL); + data = _p11_buffer_uninit_steal (&msg->buffer, &n_data); + ret = (module->vtable->transport) (module->vtable, &data, &n_data); + _p11_buffer_init_allocated (&msg->buffer, data, n_data, log_allocator); + if (ret != CKR_OK) return ret; @@ -164,7 +165,6 @@ call_done (RpcModule *module, } } - _p11_rpc_socket_unref (module->socket); _p11_rpc_message_clear (msg); return ret; } @@ -667,7 +667,6 @@ rpc_C_Initialize (RpcModule *module, CK_VOID_PTR init_args) { CK_C_INITIALIZE_ARGS_PTR args = NULL; - RpcSocket *socket = NULL; void *reserved = NULL; CK_RV ret = CKR_OK; RpcMessage msg; @@ -708,7 +707,7 @@ rpc_C_Initialize (RpcModule *module, pthread_mutex_lock (&module->mutex); pid = getpid (); - if (module->socket == NULL) { + if (module->initialized_pid != 0) { /* This process has called C_Initialize already */ if (pid == module->initialized_pid) { _p11_message ("C_Initialize called twice for same process"); @@ -718,17 +717,10 @@ rpc_C_Initialize (RpcModule *module, } /* Call out to initialize client callback */ - if (module->vtable->initialize) { - ret = (module->vtable->initialize) (module->vtable->data, reserved, &socket); - if (ret != CKR_OK) - goto done; - module->socket = socket; - } - - if (module->socket == NULL) { - ret = CKR_DEVICE_ERROR; + assert (module->vtable->initialize); + ret = (module->vtable->initialize) (module->vtable->data, reserved); + if (ret != CKR_OK) goto done; - } /* If we don't have read and write fds now, then initialize other side */ ret = call_prepare (module, &msg, RPC_CALL_C_Initialize); @@ -741,15 +733,11 @@ rpc_C_Initialize (RpcModule *module, done: /* Mark us as officially initialized */ - if (ret == CKR_OK) { + if (ret == CKR_OK) module->initialized_pid = pid; - } else if (ret != CKR_CRYPTOKI_ALREADY_INITIALIZED) { - if (module->socket) - _p11_rpc_socket_unref (module->socket); - module->socket = NULL; + else if (ret != CKR_CRYPTOKI_ALREADY_INITIALIZED) module->initialized_pid = 0; - } pthread_mutex_unlock (&module->mutex); @@ -765,7 +753,7 @@ rpc_C_Finalize (RpcModule *module, RpcMessage msg; _p11_debug ("C_Finalize: enter"); - return_val_if_fail (module->socket == NULL, CKR_CRYPTOKI_NOT_INITIALIZED); + return_val_if_fail (module->initialized_pid == 0, CKR_CRYPTOKI_NOT_INITIALIZED); return_val_if_fail (!reserved, CKR_ARGUMENTS_BAD); pthread_mutex_lock (&module->mutex); @@ -777,9 +765,8 @@ rpc_C_Finalize (RpcModule *module, if (ret != CKR_OK) _p11_message ("finalizing the daemon returned an error: %d", ret); - /* This should stop all other calls in */ - _p11_rpc_socket_unref (module->socket); - module->socket = NULL; + assert (module->vtable->finalize); + (module->vtable->finalize) (module->vtable, reserved); module->initialized_pid = 0; pthread_mutex_unlock (&module->mutex); @@ -2031,7 +2018,7 @@ static RpcModule *RPC_MODULES[] = { sizeof (RPC_MODULES) / sizeof (RPC_MODULES[0]) CK_FUNCTION_LIST_PTR -_p11_rpc_client_register (const RpcClientVtable *vtable) +_p11_rpc_client_register (RpcClientVtable *vtable) { static pthread_mutex_t register_mutex = PTHREAD_MUTEX_INITIALIZER; CK_FUNCTION_LIST_PTR function_list = NULL; |