gboolean gkd_pkcs11_startup_pkcs11 (void) { GIOChannel *channel; const gchar *base_dir; int sock; base_dir = gkd_util_get_master_directory (); g_return_val_if_fail (base_dir, FALSE); sock = gkm_rpc_layer_startup (base_dir); if (sock == -1) return FALSE; channel = g_io_channel_unix_new (sock); g_io_add_watch (channel, G_IO_IN | G_IO_HUP, accept_rpc_client, NULL); g_io_channel_unref (channel); egg_cleanup_register (pkcs11_rpc_cleanup, NULL); return TRUE; }
int main (int argc, char *argv[]) { CK_C_GetFunctionList func_get_list; CK_FUNCTION_LIST_PTR funcs; void *module; fd_set read_fds; int sock, ret; CK_RV rv; /* The module to load is the argument */ if (argc != 2) usage(); /* Load the library */ module = dlopen(argv[1], RTLD_NOW); if(!module) { fprintf (stderr, "couldn't open library: %s: %s\n", argv[1], dlerror()); exit (1); } /* Lookup the appropriate function in library */ func_get_list = (CK_C_GetFunctionList)dlsym (module, "C_GetFunctionList"); if (!func_get_list) { fprintf (stderr, "couldn't find C_GetFunctionList in library: %s: %s\n", argv[1], dlerror()); exit (1); } /* Get the function list */ rv = (func_get_list) (&funcs); if (rv != CKR_OK || !funcs) { fprintf (stderr, "couldn't get function list from C_GetFunctionList in libary: %s: 0x%08x\n", argv[1], (int)rv); exit (1); } /* RPC layer expects initialized module */ rv = (funcs->C_Initialize) (&p11_init_args); if (rv != CKR_OK) { fprintf (stderr, "couldn't initialize module: %s: 0x%08x\n", argv[1], (int)rv); exit (1); } gkm_rpc_layer_initialize (funcs); sock = gkm_rpc_layer_startup (SOCKET_PATH); if (sock == -1) exit (1); is_running = 1; while (is_running) { FD_ZERO (&read_fds); FD_SET (sock, &read_fds); ret = select (sock + 1, &read_fds, NULL, NULL, NULL); if (ret < 0) { if (errno == EINTR) continue; fprintf (stderr, "error watching socket: %s\n", strerror (errno)); exit (1); } if (FD_ISSET (sock, &read_fds)) gkm_rpc_layer_accept (); } gkm_rpc_layer_shutdown (); gkm_rpc_layer_uninitialize (); rv = (funcs->C_Finalize) (NULL); if (rv != CKR_OK) fprintf (stderr, "couldn't finalize module: %s: 0x%08x\n", argv[1], (int)rv); dlclose(module); return 0; }