CK_FUNCTION_LIST * p11_init(void) { CK_RV rv; CK_RV (*pfoo)(); char *loc1_lib = "/usr/lib/pkcs11/PKCS11_API.so64"; char *loc2_lib = "libopencryptoki.so"; CK_FUNCTION_LIST *funcs = NULL; p11_lib = dlopen(loc1_lib, RTLD_NOW); if (p11_lib != NULL) goto get_list; p11_lib = dlopen(loc2_lib, RTLD_NOW); if (p11_lib == NULL) { print_error("Couldn't get a handle to the PKCS#11 library."); return NULL; } get_list: pfoo = (CK_RV (*)())dlsym(p11_lib,"C_GetFunctionList"); if (pfoo == NULL) { print_error("Couldn't get the address of the C_GetFunctionList routine."); dlclose(p11_lib); return NULL; } rv = pfoo(&funcs); if (rv != CKR_OK) { p11_error("C_GetFunctionList", rv); dlclose(p11_lib); return NULL; } rv = funcs->C_Initialize(NULL_PTR); if (rv != CKR_OK) { p11_error("C_Initialize", rv); dlclose(p11_lib); return NULL; } if (v_flag > 1) printf("PKCS#11 library initialized\n"); return funcs; }