static void pkcs11_daemon_cleanup (gpointer unused) { CK_RV rv; g_assert (pkcs11_roof); gkd_ssh_agent_uninitialize (); gkm_rpc_layer_uninitialize (); gkd_gpg_agent_uninitialize (); rv = (pkcs11_roof->C_Finalize) (NULL); if (rv != CKR_OK) g_warning ("couldn't finalize internal PKCS#11 stack (code: %d)", (gint)rv); pkcs11_roof = NULL; }
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; }